我从同步方法调用来自C#ASP.Net Web应用程序的异步Web api。我收到错误。 发生了一个或多个错误。发送请求时发生错误。 底层连接已关闭:接收时发生意外错误。 无法从传输连接读取数据:远程主机强制关闭现有连接。
如果我使用异步方法从Windows窗体应用程序调用相同的异步web api,则web api将返回完美的值。我必须在Web应用程序中使用同步方法,因此在Windows应用程序中成功测试的代码不能在Web应用程序中使用。 下面是代码的一部分。
private string SECURE_API_Async(string WebApiURL, HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues)
{
try
{
using (httpContent)
{
Last_HTTPRequestContent = httpContent == null ? "null" : httpContent.ReadAsStringAsync().Result;
HttpClient httpClient = new HttpClient(httpClientHandler);
httpClient.BaseAddress = new Uri(WebApiURL);
if (SessionTokenID != null)
{
httpClient.DefaultRequestHeaders.Add("SessionTokenID", SessionTokenID);
}
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
string target_URI = "api";
foreach (string apiName in apiNames)
{
target_URI = string.Format("{0}/{1}",
target_URI,
apiName);
}
string target_URI_parameters = string.Empty;
if (apiValues != null)
{
target_URI_parameters = CreateParameterString(apiValues);
}
target_URI = (target_URI_parameters == string.Empty) ? target_URI : string.Format("{0}?{1}", target_URI, target_URI_parameters);
_lastURL = httpClient.BaseAddress.ToString() + target_URI;
Last_HTTPstatus = 0;
Last_ReasonPhrase = string.Empty;
Last_HTTPResponse = null;
Last_HTTPResponseString = string.Empty;
HttpResponseMessage response = null;
try
{
switch (httpMethod)
{
case HTTP.PUT:
{
response = httpClient.PutAsync(target_URI, httpContent).Result;
break;
}
调用PutAsync方法时出错。
现在,如果我将方法更改为
private **async** **Task<string>** SECURE_API_Async(string WebApiURL, HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues)
和API调用
response = **await** httpClient.PutAsync(target_URI, httpContent);
我得到了正确的回复。 我在搜索网后学到的是
response = **await** httpClient.PutAsync(target_URI, httpContent);
(当调用方法具有异步关键字时,意味着调用方法是异步的)和
response = httpClient.PutAsync(target_URI, httpContent).**Result**;
(当方法没有async关键字时意味着调用方法是同步的)
应该返回正确的响应消息。 但我的同步方法抛出了底层连接错误。 有人可以帮忙吗? 谢谢。
答案 0 :(得分:0)
我传递了错误的凭据。所以我收到错误远程主机强行关闭现有连接。奇怪的错误。如果您使用MS技术,其中一个令人头疼的问题。他们只是没有抛出正确的错误。正确的错误输出应该是用户凭据错误。
但问题是,如果使用Result,则可以调用异步方法 例如。
HttpResponseMessage response = httpClient.PutAsync(target_URI,httpContent).Result; //来自同步方法的同步调用
和
HttpResponseMessage response = await httpClient.PutAsync(target_URI,httpContent); //来自ASync方法的同步调用,该方法具有async关键字前缀
给出相同的结果。