Foreground:.NET Coreプロジェクト(.Net Standard 1.4のアセンブリを使用して.NET 4.6.1をターゲットにする)のバグを調査していましたが、MissingMethodExceptionがスローされましたが、これは決して可能ではありませんでした。障害のあるメソッドを分離するために、コードのコアを.NET 4.6.1をターゲットとする別の単体テストに取り出しました。.NET Core(.NET Standard 1.4および.NET Framework 4.6.1)でSystem.Net.Httpにawait/asyncを使用している場合のバグはありますか?
ユニットテストは、多かれ少なかれ、この(それいつか様々な)であるから、私は、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の理由は、元の実装が、この1つのメソッドをすべてのHttp *作業に使用する一般的な実装であるということです。同じエラーがGetAsyncなどでトリガされる可能性があります。
ここで間違っていることはわかりませんが、このエラーは.NET CLRのどこかのバグであると思われます。
UPDATE
ユニットテストの問題は、ASP.NETコアのWeb-APIに(ありがとう)、私はまだ経験した問題を解決しましたが。私の理解から、.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