Передний план: я изучал ошибку в проекте ASP.NET Core (с таргетингом на .NET 4.6.1, используя сборки из .Net Standard 1.4), которые бросали исключение MissingMethodException, хотя это никоим образом не могло быть возможным. Изолируя метод отказа, я взял ядро кода в отдельный модульный тест, который также нацелен на .NET 4.6.1.Ошибка при использовании await/async для System.Net.Http с .NET Core (.NET Standard 1.4 и .NET Framework 4.6.1)?
Исключение я получаю, ThreadAbortException
, от модульного тестирования больше или меньше этого (он когда-то разные):
at System.Net.Http.WinHttpHandler.SetRequestHandleDecompressionOptions(SafeWinHttpHandle requestHandle)
at System.Net.Http.WinHttpHandler.SetRequestHandleOptions(WinHttpRequestState state)
at System.Net.Http.WinHttpHandler.<StartRequest>d__103.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Hub.Test.UnitTest1.<FetchUrlAsync>d__2.MoveNext()
код в вопросе за abolve исключением:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
//FetchUrl(); // works
var task = FetchUrlAsync(); // does not work
}
private void FetchUrl()
{
var handler = new HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
using (var client = new HttpClient(handler, true))
{
var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, new Uri("https://github.com/dotnet/core"))).Result;
Trace.WriteLine("FetchUrl:" + response.StatusCode);
}
}
private async Task FetchUrlAsync()
{
try
{
var handler = new HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
using (var client = new HttpClient(handler, true))
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, new Uri("https://github.com/dotnet/core")));
Trace.WriteLine("FetchUrlAsync: " + response.StatusCode);
}
}
catch (Exception e)
{
Trace.WriteLine(e);
throw;
}
}
}
Уведомление , что если я вызываю FetchUrl(), код работает. Да, я знаю, что это стало методом синхронизации в момент, когда я вызвал результат, но он предназначен только для демонстрации.
Однако метод FetchUrlAsync() не отвечает за исключение ThreadAbortException.
Причина для SendAsync заключается в том, что первоначальная реализация является общей, используя этот один метод для всей работы Http *. Та же ошибка может быть вызвана с помощью GetAsync и т. Д.
Я не могу понять, что я делаю неправильно здесь, но я подозреваю, что эта ошибка является ошибкой где-то в .NET CLR.
UPDATE
Хотя проблема модульного тестирования была решена (спасибо), я все еще испытывал проблемы в веб-API ASP.NET Core. По моему мнению, .NET Standard 1.4 и .NET Framework 4.6.1 должны быть совместимы с 1-1. Вот почему я считаю, что в этой области есть редкая ошибка, хотя она кажется маловероятной.
Общий знаменатель - System.Net.Http; и это изменяется поразрядным образом из .NET Standard 1.4 и .NET Framework 4.6.1; и я, как правило, выясняю, в чем проблема, и отправляю ответ другим, которые могут столкнуться с подобной проблемой.
Ну, для начала вы не «ждете» задачи. – DavidG
В одном методе 'response' является' Task ', а в другом -' HttpResponseMessage', но вы, похоже, относитесь к ним одинаково. –
juharr
@juharr Обратите внимание на '.Result' в конце неасинхронного метода. – DavidG