我使用httpwebrequest进行async调用Web服务,有时 endgetResponse()返回一些例外。但是,即使我有例外,呼叫也成功并返回数据。以下是我的代码,并删除了错误检查代码。我有4个日志项目,订单就是这样:
返回以下结果:...
GetResult成功了!
Postxml例外:...
GetResult例外:...
public async Task<string> GetResult(string xmlData)
{
try
{
string response = await PostXML(Url, xmlData).ConfigureAwait(false);
_logger.Log($"GetResult is successful!");
return response;
}
catch (Exception ex)
{
_logger.Log("GetResult exception: " + ex.ToString());
throw;
}
}
private async Task<string> PostXML(string destinationUrl, string requestXml)
{
try
{
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)await Task.Factory
.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string responseStr = new StreamReader(responseStream).ReadToEnd();
_logger.Log("The following result is returned: rn" + responseStr);
responseStream.Close();
return responseStr;
}
}
catch (Exception ex)
{
_logger.Log("PostXML exception: " + ex.ToString());
throw;
}
return null;
}
例外是这样:
postxml()异常:System.NET.WebException:基础连接已关闭:服务器预计将保持活跃的连接已被服务器关闭。
在system.net.httpwebrequest.endgetresponse(iasyncresult asyncresult)
在system.threading.tasks.taskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func
2端功能,操作1 endAction, Task
1 Promise,Boolean Meedialsynchronization)
---堆栈跟踪的结束来自以前的位置,该位置被抛出了---
在system.runtime.com.pilerservices.taskawaiter.throwfornonsuccess(任务任务)
在system.runtime.com.pilerservices.taskawaiter.handlenonsuccessanddebuggernotification(任务任务)
在myService.d__7.movenext()
我想我还没有完全了解HTTPWebRequest在异步模式下的工作方式。无论如何,我希望这些问题可以帮助我更多地了解:
1。为什么执行甚至发生了例外?在我的理解中,只有2个日志项目可以记录例外。
2。例外"基础连接已关闭"的原因是什么?为什么发生例外,但该服务仍然给出了正确的结果?
为什么执行甚至发生例外?在我的理解中,只有2个日志项目可以记录例外。
这是不可能的。我怀疑您的代码两次调用GetResult
。这就是日志似乎表示的。
发生"基础连接已关闭"的原因是什么?
当服务器准备好关闭客户端之前,这会发生这种情况。这是从REST API中获得的不寻常错误,但不是闻所未闻的。