繁体   English   中英

HTTPClient error when calling ASP.NET Web API REST service from ASP.NET MVC app

[英]HTTPClient error when calling ASP.NET Web API REST service from ASP.NET MVC app

I have an ASP.NET MVC application which is invoking a ASP.NET Web Api REST service:

public class MyClass
{
    private static HttpClient client = new HttpClient();

    public async Task DumpWarehouseDataIntoFile(Warehouse myData, string path, string filename)  // See Warehouse class later in this post
    { 
        try
        {

           //Hosted web API REST Service base url  
           string Baseurl = "http://XXX.XXX.XX.X:YYYY/";  

           //using (var client = new HttpClient())  --> I have declared client as an static variable
           //{  
            //Passing service base url  
            client.BaseAddress = new Uri(Baseurl);  

            client.DefaultRequestHeaders.Clear();  
            //Define request data format  
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
              
            // Serialize parameter to pass to the asp web api rest service
            string jsonParam = Newtonsoft.JsonConvert.SerializeObject(myData);

            //Sending request to find web api REST service resource  using HttpClient

            var httpContent = new StringContent(jsonParam, Encoding.UTF8, "application/json");

            HttpResponseMessage Res = await client.PostAsync("api/Warehouse/DumpIntoFile", httpContent);  

            //Checking the response is successful or not which is sent using HttpClient  
            if (Res.IsSuccessStatusCode)  
            {  
               // Some other sftuff here
            }
           //}
         }
         catch (Exception ex)
         {
              // Do some stuff here
         } // End Try

    } // End DumpWarehouseDataIntoFile method
} // End class

The ASP.NET Web API REST Controller:

public class WarehouseController : ApiController
{ 
    public bool DumpIntoFile(string data)
    {
           // Stuff here
    }
}

我使用了 HttpClient static 变量,我没有将它包含在“使用”块中,因为不推荐使用此链接中的说明: 您正在使用 HTTPCLIENT 错误,它正在破坏您的软件

执行此代码时,它会失败并出现错误:

System.Net.Http.HttpRequestException:发送请求时出错。 System.Net.WebException:无法解析远程名称:'xxx'

我想我不需要处理 HttpClient 客户端 object,对吧?

我该如何解决这个问题?

我正在使用 Visual Studio 2013 和 NET 4.5(非核心)

UPDATE 2020/12/10 : Previous error was occurring because of ASP.NET Web API REST Url was not configured correctly in the internal DNS.

现在解决先前的错误后,我得到以下错误:

404 未找到

下面是client.PostAsync返回的一些错误消息:

在此处输入图像描述

Ping 到 ASP.NET Web API Z55276C10D84E1DF7713B441E76E141 正在工作。

也许我的 web api 路由配置在下面的 App_Start\WebApiConfig.cs 下缺少一些东西?

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Configuración y servicios de API web

        // Rutas de API web
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

可能的看点:

  1. 检查您的 WebApi 文档。 web API 中的 404 表示主机无法访问或您调用的端点错误。 首先通过在浏览器中粘贴 URL 来检查。 如果它是一个 POST 操作并且您的机器可以访问,那么您将收到一个method not supported的错误。

  2. 如果在浏览器中,如果它再次出现 404 但您知道它是正确的,那么您应该查看机器的 ACL(用户授权和身份验证)。 该机器是否可访问/可访问您的网络。

  3. 我在您的代码中看不到任何授权标头。 请也检查一下。

  4. 很少可能 - 如果它需要一些预配置的应用程序,如 Facebook、Google 等。

我假设您正在使用基于您提供的WebApiConfig的 Web API 2。 关于您收到的 404 响应,这完全源于您的 controller 操作中路由的不正确使用或缺少路由。

使用您的示例 WebApiConfig,这将启用属性路由以及使用 Web API 的默认路由模板的基于约定的路由。 默认模板不会根据动作名称匹配,它仅根据请求的 controller 名称和 HTTP 方法(GET、POST 等)匹配。 示例GET http://localhost:5000/api/books/2将路由到BooksController并调用与命名约定匹配的操作方法,即GetBookById(int id)

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

在您的情况下,您有一个名为DumpIntoFile(string data)的操作方法,它不遵循上述标准命名约定,因此路由系统不知道要调用哪个操作。 您可以使用在配置中启用的属性路由来解决此问题。 您需要向您的操作方法添加一个属性,该属性指定 HTTP 动词以及应该调用该方法的路由。 请注意应添加到 controller class 的附加属性,该属性指定路由前缀。

[RoutePrefix("api/warehouse")]
public class WarehouseController : ApiController
{
    // Routes POST http://localhost:5000/api/warehouse/dump
    [Route("dump")]
    [HttpPost]
    public bool DumpIntoFile(string data)
    {
        //...
    }
}

这会将 POST 请求路由到http://localhost:5000/api/warehouse/dump 显然localhost:5000是您的基本 uri 的占位符。 我不知道请求中的data有多复杂,但您可以参考有关如何处理请求正文中的数据的文档。 该示例主要关注路由部分。

这只是一个简单的示例,您可以使用各种不同的属性来指定路由、接受的方法等。 文档很好地概述了它并提供了大量示例。 下面提供了链接。 另外,我建议返回IHttpActionResultHttpResponseMessage类型之一,而不是简单的 bool/string/int/etc。 它只是为您返回的 HTTP 响应类型提供了更多选项,这些也在文档中。

文档: https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM