Я использовал HttpWebRequest для асинхронного вызова веб-службы, иногда 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 обещание, логическое значение требует синхронизации)--- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение ---в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача)в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача)at MyService.d__7.MoveNext ()
Полагаю, я не до конца понял, как HttpWebRequest работает в асинхронном режиме.В любом случае, я надеюсь, что эти вопросы помогут мне понять это больше:1. Почему выполнение продолжается даже при возникновении исключения?В моем понимании должно быть только 2 элемента журнала, чтобы зарегистрировать исключение.2. По какой причине возникает исключение «Базовое соединение было закрыто»?Почему возникает исключение, но служба все еще возвращает правильный результат?