【问题标题】:Calling remote web api from mvc controller从 mvc 控制器调用远程 Web api
【发布时间】:2016-09-26 02:40:47
【问题描述】:

为每个控制器处理 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");
    }
}

【问题讨论】:

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


【解决方案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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多