在WebApi2 + Owin中使用AuthorizeAttribute时,HEAD请求失败并显示System.Net.ProtocolViolationException的原因是HEAD请求方法不支持身份验证。在WebApi2中,默认情况下,AuthorizeAttribute会应用到所有的HTTP请求方法,包括HEAD请求。然而,根据HTTP规范,HEAD请求方法不应该包含请求体,而身份验证通常需要在请求体中传递凭证信息。因此,当使用AuthorizeAttribute进行身份验证时,如果请求方法为HEAD,会导致System.Net.ProtocolViolationException异常。
解决这个问题的方法是自定义AuthorizeAttribute,并在其中排除HEAD请求方法。以下是一个示例:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
if (actionContext.Request.Method == HttpMethod.Head)
{
return true; // 排除HEAD请求方法,直接返回true
}
// 其他请求方法进行身份验证
return base.IsAuthorized(actionContext);
}
}
然后,在需要进行身份验证的控制器或动作方法上使用CustomAuthorizeAttribute替代AuthorizeAttribute。
[CustomAuthorize]
public class MyController : ApiController
{
// ...
}
这样,当HEAD请求到达时,将不会进行身份验证,避免了System.Net.ProtocolViolationException异常的发生。
关于WebApi2和OWIN的更多信息,您可以参考以下链接:
领取专属 10元无门槛券
手把手带您无忧上云