从mvc控制器调用远程web api

时间:2016-09-24 23:08:09

标签: c# asp.net-mvc asp.net-web-api

处理每个控制器的Web api端点的首选方法是什么? 例如,我的MVC控制器将调用不同的端点。 这些是目前唯一的,但它可能会改变。

此外,我将在本地开发并部署到开发服务器。

http://localhost:42769/api/categories/1/products

http://localhost:42769/api/products/

public class ProductsController : Controller
{
    HttpClient client;
    string url = "http://localhost:42769/api/categories/1/products"; //api/categories/{categoryId}/products

    public ProductsController()
    {
        client = new HttpClient();
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }


    // GET: Products
    public async Task<ActionResult> ProductsByCategory()
    {
        HttpResponseMessage responseMessage = await client.GetAsync(url);
        if (responseMessage.IsSuccessStatusCode)
        {
            var responseData = responseMessage.Content.ReadAsStringAsync().Result;
            var products = JsonConvert.DeserializeObject<List<GetProductsByCategoryID>>(responseData);
            return PartialView(products);
        }

        return View("Error");
    }
}

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的问题或问题,但我会为该服务创建一个包装类,然后为您需要调用的每个资源使用不同的方法。总是想SOLID

示例(手写)

public class Client
{
    private Uri baseAddress;

    public Client(Uri baseAddress)
    {
        this.baseAddress = baseAddress;
    }

    public IEnumerable<Products> GetProductsFromCategory(int categoryId)
    {
         return Get<IEnumerable<Product>>($"api/categories/{categoryId}/products");
    }

    public IEnumerable<Products> GetAllProducts()
    {
         return Get<IEnumerable<Product>>($"api/products");
    }

    private T Get<T>(string query)
    {
        using(var httpClient = new HttpClient())
        {
             httpClient.BaseAddress = baseAddress;

             var response= httpClient.Get(query).Result;
             return response.Content.ReadAsAsync<T>().Result;
        }
    }
}