Установка Result в контексте метода ChallengeAsync в фильтре аутентификации
Этот вопрос связан с ответом, который я далВот, Комментарий ОП заставил меня задуматься. Я предложил использовать реализацию классаIHttpActionResult
как это вChallengeAsync
метод фильтра аутентификации.
public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
CancellationToken cancellationToken)
{
context.Result = new ResultWithChallenge(context.Result);
return Task.FromResult(0);
}
public class ResultWithChallenge : IHttpActionResult
{
private readonly IHttpActionResult next;
public ResultWithChallenge(IHttpActionResult next)
{
this.next = next;
}
public async Task<HttpResponseMessage> ExecuteAsync(
CancellationToken cancellationToken)
{
var response = await next.ExecuteAsync(cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
response.Headers.WwwAuthenticate.Add(
new AuthenticationHeaderValue("Basic", "realm=localhost"));
}
return response;
}
}
Вместо этого я могу упроститьChallengeAsync
как это.
public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
CancellationToken cancellationToken)
{
var result = await context.Result.ExecuteAsync(cancellationToken);
if (result.StatusCode == HttpStatusCode.Unauthorized)
{
result.Headers.WwwAuthenticate.Add(
new AuthenticationHeaderValue("Basic", "realm=localhost"));
}
context.Result = new ResponseMessageResult(result);
}
Это спасает меня от создания класса, реализующегоIHttpActionResult
но это правильный путь? У меня возникает неприятное ощущение, что это как-то плохо с точки зрения производительности, потому что мне кажется, что я конвертирую результат действия в HttpResponseMessage и обратно в результат действия. Любые указатели на необходимость отдельного класса здесь реализуютIHttpActionResult
как то, что я предложил, будет оценено по сравнению с использованием кода выше.