2016-05-13 9 views
2

WebApi 2プロジェクトのDelegatingHandlerに次のコードがあります。私のマシン上でnull条件付き演算子、一部のマシンで期待どおりに動作しない

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var content = await request.Content?.ReadAsStringAsync(); 
     _log.Information("Received {request} with content body: {content}.", request, content); 

     // Run the rest of the request pipeline. 
     var result = await base.SendAsync(request, cancellationToken); 

     var responseContent = await result.Content?.ReadAsStringAsync(); 
     _log.Information("Returning {result} with content body: {responseContent}.", result, responseContent); 

     return result; 
    } 

予想通り、これは動作し、(result.contentがnullになります)301リダイレクトで応答時に私はresponseContentを取得== nullを。ただし、同僚のマシンでは、この行でヌル参照例外を受け取ります。我々は両方の次のように限り、我々が言うことができるように違いがあり、4.5.1ランタイムを使用している、次のとおりです。

忍者編集)動作しません。 、これらの原因の1つは訴える?確認が必要なコンパイラやコンパイラオプションに違いがありますか?あるいは、私は簡単な説明をしているものを探していますか?

+1

古い学校のヌルチェックを試しましたか? – Slugart

+1

異なるマシン上の同じバイナリ...または別のコンパイル?別のコンパイルの場合はILコードを比較 –

+1

result.Contentがnullの場合、NullReferenceExceptionをスローする "await null"になります。あなたはあなたのケースでresult.Contentが本当にnullであることを確認しますか? – Evk

答えて

3

私は2台のマシン間の差があるかわからないが、あなたのコードが間違っている:これは何

await result.Content?.ReadAsStringAsync(); 

は、result.Contentnullないときに、ReadAsStringAsync()が呼び出されていることであり、その結果はawait ed。しかし、result.Contentnullの場合、サブ表現result.Content?.ReadAsStringAsync()は全体がであり、awaitNullReferenceExceptionを投げることを意味します。

したがって、result.Contentnullであることから保護したい場合は、旧式のifまたは3者演算子を使用することをお勧めします。

+0

ああ。あなたが正しい!ありがとうございました...私はまだ "待っているヌル"が私のマシンで例外をスローしないのですが、私の同僚マシンではどうしたらいいのか理解しておく必要があります。 301リダイレクト...いずれにしてもまだ問題はありますが、これはこの特定の質問に答えます。 – Rob

関連する問題