61

我过去创建了几个 ASP.NET MVC 应用程序,但我以前从未使用过 WebAPI。我想知道如何创建一个简单的 MVC 4 应用程序,该应用程序通过 WebAPI 而不是通过普通的 MVC 控制器执行简单的 CRUD 操作。诀窍是 WebAPI 应该是一个单独的解决方案(事实上,很可能在不同的服务器/域上)。

我怎么做?我错过了什么?是否只是设置指向 WebAPI 服务器的路由的问题?我发现的所有显示如何使用 MVC 应用程序使用 WebAPI 的示例似乎都假设 WebAPI 已“嵌入”到 MVC 应用程序中,或者至少位于同一台服务器上。

哦,澄清一下,我不是在谈论使用 jQuery 的 Ajax 调用......我的意思是 MVC 应用程序的控制器应该使用 WebAPI 来获取/放置数据。

4

5 回答 5

82

您应该使用新的 HttpClient 来使用您的 HTTP API。我还可以建议您使您的呼叫完全异步。由于 ASP.NET MVC 控制器动作支持基于任务的异步编程模型,它非常强大和简单。

这是一个过于简化的例子。以下代码是示例请求的帮助程序类:

public class CarRESTService {

    readonly string uri = "http://localhost:2236/api/cars";

    public async Task<List<Car>> GetCarsAsync() {

        using (HttpClient httpClient = new HttpClient()) {

            return JsonConvert.DeserializeObject<List<Car>>(
                await httpClient.GetStringAsync(uri)    
            );
        }
    }
}

然后,我可以通过我的 MVC 控制器异步使用它,如下所示:

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

        return View("index",
            await service.GetCarsAsync()
        );
    }
}

您可以查看下面的帖子,了解使用 ASP.NET MVC 进行异步 I/O 操作的效果:

我对 C# 5.0 和 ASP.NET MVC Web 应用程序中基于任务的异步编程的看法

于 2012-11-03T06:25:21.273 回答
18

感谢大家的回复。我认为@tugberk 让我走上了正确的道路。这对我有用...

对于我的 CarsRESTService 助手:

public class CarsRESTService
{
    readonly string baseUri = "http://localhost:9661/api/cars/";

    public List<Car> GetCars()
    {
        string uri = baseUri;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<List<Car>>(response.Result).Result;
        }
    }

    public Car GetCarById(int id)
    {
        string uri = baseUri + id;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<Car>(response.Result).Result;
        }
    }
}

然后对于 CarsController.cs:

public class CarsController : Controller
{
    private CarsRESTService carsService = new CarsRESTService();

    //
    // GET: /Cars/

    public ActionResult Index()
    {
        return View(carsService.GetCars());
    }

    //
    // GET: /Cars/Details/5

    public ActionResult Details(int id = 0)
    {
        Car car = carsService.GetCarById(id);

        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }
}
于 2012-11-05T18:50:14.037 回答
10

您可以使用 WCF 来使用该服务。像这样:

[ServiceContract]
public interface IDogService
{
    [OperationContract]
    [WebGet(UriTemplate = "/api/dog")]
    IEnumerable<Dog> List();
}

public class DogServiceClient : ClientBase<IDogService>, IDogService
{
    public DogServiceClient(string endpointConfigurationName) : base(endpointConfigurationName)
    {
    }

    public IEnumerable<Dog> List()
    {
        return Channel.List();
    }
}

然后你可以在你的控制器中使用它:

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public ActionResult List()
    {
        var service = new DogServiceClient("YourEndpoint");
        var dogs = service.List();
        return View(dogs);
    }
}

在您的 web.config 中放置端点的配置:

<system.serviceModel>
  <client>
    <endpoint address="http://localhost/DogService" binding="webHttpBinding"
    bindingConfiguration="" behaviorConfiguration="DogServiceConfig" 
    contract="IDogService" name="YourEndpoint" />
  </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="DogServiceConfig">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>
于 2012-11-03T09:07:43.640 回答
1

http://restsharp.org/是您问题的答案。我目前在具有类似结构的应用程序中使用它。

但更一般地说,使用 WebAPI 只是发布和请求数据,如何处理取决于您。你甚至可以使用标准的 WebRequest 和 JavascriptSerializer。

干杯。

于 2012-11-02T17:47:14.183 回答
1

在这种情况下,您可以使用HttpClient从控制器中使用 Web API。

于 2012-11-03T03:36:34.380 回答