【问题标题】:Headers disappearing when using HttpSelfHostServer使用 HttpSelfHostServer 时标题消失
【发布时间】:2012-03-19 15:19:15
【问题描述】:

我正在将一个相当广泛的 REST 服务从 WCF 迁移到 ASP.NET WebAPI。我们正在使用 Authorization 标头将令牌从客户端发送到服务器,并且我使用代码实现了 DelegateHandler,一旦发现没有有效的 Authorization 标头,就会以 401 响应。可以在这里看到代码的简化:

public class AuthenticationHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request == null) throw new ArgumentNullException("request");
        return !IsClientAuthorized(request)
            ? Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.Unauthorized))
            : base.SendAsync(request, cancellationToken);
    }

    private bool IsClientAuthorized(HttpRequestMessage request)
    {
        return request != null && !string.IsNullOrEmpty(request.Headers.Authorization.ToString());
    }
}

它在 IIS 中托管时工作正常,但对于集成测试,我使用的是 HttpSelfHostServer,并且此处的授权标头不存在于 HttpRequestMessage 上,即使我可以看到它是在 Fiddler 跟踪上发送的。

我尝试使用自托管创建一个非常简单的 WebAPI 应用程序来验证问题是否一致,但不幸的是它在那里按预期工作。所以它一定与我的代码有关,但我完全不知道是什么原因造成的。

有没有其他人看到过这种行为,或者有没有人有关于如何追踪 WebAPI 堆栈中哪里出错的建议?

【问题讨论】:

    标签: wcf-web-api asp.net-web-api


    【解决方案1】:

    问题原来是由发送的授权标头的格式引起的。我们希望 Authorization 标头看起来像这样:

    Authorization: 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==
    

    这在 WCF 下工作得很好,但它没有按照 HTTP 标准进行格式化,它需要一个方案和一个值。例如:

    Authorization: XAPI 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==
    

    我的猜测是,只有标头中的值,Web API 会将其视为方案,并且此处只允许某些字符。当我添加 XAPI 作为方案并使用相同的值时,一切正常,并且 Authorization 标头可用于我在 HttpRequestMessage.Headers.Authorization 上的代码。

    但是我认为这是 Web API 中的一个错误,如果请求的格式无效,则允许继续进行请求并且忽略标头。如果标头根据规范无效,我希望它会以 400 Bad Request 响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多