2016-05-13 8 views
2

Ich habe den folgenden Code in einem DelegatingHandler für ein WebApi 2-Projekt.Nullbedingter Operator, verhält sich auf einigen Computern nicht wie erwartet

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; 
    } 

Auf meinem Rechner funktioniert das wie erwartet, und während einer Reaktion, die ein 301-Redirect ist (wo result.content wäre null) Ich responseContent bekommen == null; Auf einem Mitarbeitercomputer erhält er jedoch eine Null-Referenz-Ausnahme in dieser Zeile. Wir verwenden sowohl die 4.5.1 Laufzeit, die Unterschiede so weit wie wir sagen können, ist wie folgt folgt:

  • Ich verwende VS2015 Enterprise-SP2 (wo es funktioniert), wird er mit VS2015 Professional SP2 (wo es funktioniert nicht)

Ninja Bearbeiten - the .NET versions and service packs I have installed as well as the ones he has installed ...

es ist wie die Maschine sieht, wo es nicht zwei 4.5.1 Sicherheits-Updates installiert Arbeits (KB2901126 & KB2931368), dass ich dies nicht tun , würde einer dieser Gründe das sein verklagen? Gibt es einen Unterschied in den Compilern oder Compiler-Optionen, die ich überprüfen muss? Oder schaue ich auf etwas, das eine einfachere Erklärung hat?

+1

Haben Sie es mit einem Oldschool-Null-Check versucht? – Slugart

+1

Die gleichen Binärdateien auf verschiedenen Rechnern..oder eine andere Zusammenstellung? Vergleichen Sie den IL-Code, wenn es sich um eine andere Kompilierung handelt. –

+1

Wenn result.Content null ist, erhalten Sie am Ende "wait null", was NullReferenceException auslösen sollte. Bist du sicher, dass in deinem Fall result.Content wirklich Null ist? – Evk

Antwort

3

Ich weiß nicht, was der Unterschied zwischen den beiden Maschinen, aber der Code ist falsch:

await result.Content?.ReadAsStringAsync(); 

Was das bedeutet, das ist, wenn result.Content nicht null ist, ReadAsStringAsync() genannt wird, und das Ergebnis ist await Ed, wie es sollte. Aber wenn result.Contentnull ist, ist der ganze Teilausdruck result.Content?.ReadAsStringAsync()null, was bedeutet, dass die await einen NullReferenceException werfen wird.

Also, wenn Sie vor result.Content schützen wollen, die null ist, sollten Sie wahrscheinlich einen altmodischen if oder einen ternären Operator verwenden.

+0

Ah. Du hast recht! Danke dafür ... Ich muss noch herausfinden, warum "Warten auf Null" keine Ausnahme auf meinem Rechner auslöst, sondern auf meiner Arbeitsmaschine ... oder wenn ich tatsächlich einen Inhaltskörper auf meinem Rechner bekomme 301 redirect ... so oder so, ich habe immer noch ein Problem, aber das beantwortet diese spezielle Frage. – Rob

Verwandte Themen