Нулевой условный оператор, на некоторых машинах не работает должным образом
У меня есть следующий код в DelegatingHandler для проекта WebApi 2.
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;
}
На моей машине это работает как положено, и во время ответа, который является 301 Redirect (где result.content будет нулевым), я получаю responseContent == null; однако на машине коллег он получает исключение нулевой ссылки в этой строке. Мы оба используем среду выполнения 4.5.1, насколько мы можем судить о различиях в следующем:
- Я использую VS2015 Enterprise SP2 (там, где он работает), он использует VS2015 Professional SP2 (там, где он не работает)
Редактирование ниндзя - версии.NET и пакеты обновления, которые я установил, а также те, которые он установил...
Похоже, что на компьютере, на котором он не работает, установлены два обновления безопасности 4.5.1 ( KB2901126 и KB2931368), которые у меня не установлены, может ли одна из них вызвать эту проблему? Есть ли разница в компиляторах или опциях компилятора, которые мне нужно проверить? Или я смотрю на то, что имеет более простое объяснение?
1 ответ
Я не знаю, в чем разница между двумя машинами, но ваш код неверен:
await result.Content?.ReadAsStringAsync();
Что это делает, это когда result.Content
не является null
, ReadAsStringAsync()
называется и его результат await
Ред, как и должно быть. Но когда result.Content
является null
, все подвыражение result.Content?.ReadAsStringAsync()
является null
, что означает, что await
бросит NullReferenceException
,
Итак, если вы хотите защитить от result.Content
являющийся null
, вы должны, вероятно, использовать старомодный if
или троичный оператор.