我使用HttpWebRequest异步调用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: \r\n" + 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 endFunction,操作1 endAction, Task
1承诺,布尔值requireSynchronization)中
---从先前引发异常的位置开始的堆栈跟踪---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)上
在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在MyService.d__7.MoveNext()
我想我还没有完全理解HttpWebRequest如何在异步模式下工作。无论如何,我希望这些问题能帮助我更多地理解它:
1。为什么即使发生异常也会继续执行?以我的理解,应该只有2个日志项来记录异常。
2。发生异常“基础连接已关闭”的原因是什么?为什么会发生异常,但服务仍返回正确的结果?
答案 0 :(得分:2)
为什么即使发生异常也会继续执行?据我了解,应该只有2个日志项来记录异常。
这是不可能的。我怀疑您的代码两次调用GetResult
。日志似乎表明了这一点。
发生“基础连接已关闭”异常的原因是什么?
当服务器在客户端准备好关闭连接之前关闭连接时,会发生这种情况。这是从REST API获得的异常错误,但并非闻所未闻。