【发布时间】:2020-12-07 09:54:22
【问题描述】:
我有一个调用 ASP.NET Web Api REST 服务的 ASP.NET MVC 应用程序:
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
ASP.NET Web API REST 控制器:
public class WarehouseController : ApiController
{
public bool DumpIntoFile(string data)
{
// Stuff here
}
}
我使用了一个 HttpClient 静态变量,我没有将它包含在“使用”块中,因为不推荐使用它,如以下链接所述:YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE
执行此代码时失败并出现错误:
System.Net.Http.HttpRequestException:发送时出错 请求。 System.Net.WebException:远程名称不能是 已解决:'xxx'
我想我不需要处理 HttpClient 客户端对象,对吧?
我该如何解决这个问题?
我正在使用 Visual Studio 2013 和 NET 4.5(非核心)
2020 年 12 月 10 日更新: 由于内部 DNS 中未正确配置 ASP.NET Web API REST Url,因此发生了上一个错误。
现在在解决之前的错误后,我得到以下错误:
404 未找到
下面是client.PostAsync返回的一些错误消息:
Ping 到 ASP.NET Web API Rest 工作正常。
也许它在下面的 App_Start\WebApiConfig.cs 下我的 web api 路由配置中缺少一些东西?
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 }
);
}
}
【问题讨论】:
-
“无法解析远程名称”听起来更像是无法访问 API。你能 Ping 服务器还是通过 cUrl / Postman 试试?
-
我同意 Fildor 关于例外的看法。验证远程 API 是否可访问,并仔细检查您的请求以确保地址正确。另外,我建议您看看使用 HttpClient Factory 来创建您的 HttpClient 对象。文档链接:docs.microsoft.com/en-us/aspnet/core/fundamentals/…
-
你应该使用 HttpClientFactory。 HttpClient 缓存套接字连接,因此如果 DNS 条目发生更改,它将继续尝试连接到错误的服务器。 DNS 解析最多可能需要 15 秒,因此这是一个巨大的增益。 HttpClientFactory 会定期(默认每 10 分钟)回收连接,因此它最终会在不失去缓存优势的情况下获取任何 DNS 更改。
-
尝试将 DumpWarehouseDataIntoFile() 返回类型更改为
Task并等待它完成? -
@jandrew HttpClient Factory 是否可用于标准 ASP.NET(非核心)?您能否发布一些关于如何调整我的小代码以应用 HttpClient Factory 的小代码 sn-p?任何代码 sn-p 将不胜感激。我从未使用过 HttpClient Factory,我认为使用它是一个好习惯。因此,如果您提供一些关于如何使我的代码适应它的小代码,我将非常感谢您。提前致谢。
标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 dotnet-httpclient