[英]Calling REST service via HttpClient from ASP.net 4 Web API 2 project results in exception
[英]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 }
);
}
}
可能的看点:
检查您的 WebApi 文档。 web API 中的 404 表示主机无法访问或您调用的端点错误。 首先通过在浏览器中粘贴 URL 来检查。 如果它是一个 POST 操作并且您的机器可以访问,那么您将收到一个method not supported
的错误。
如果在浏览器中,如果它再次出现 404 但您知道它是正确的,那么您应该查看机器的 ACL(用户授权和身份验证)。 该机器是否可访问/可访问您的网络。
我在您的代码中看不到任何授权标头。 请也检查一下。
很少可能 - 如果它需要一些预配置的应用程序,如 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
有多复杂,但您可以参考有关如何处理请求正文中的数据的文档。 该示例主要关注路由部分。
这只是一个简单的示例,您可以使用各种不同的属性来指定路由、接受的方法等。 文档很好地概述了它并提供了大量示例。 下面提供了链接。 另外,我建议返回IHttpActionResult
或HttpResponseMessage
类型之一,而不是简单的 bool/string/int/etc。 它只是为您返回的 HTTP 响应类型提供了更多选项,这些也在文档中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.