我一直将一些常见属性移动到一个单独的vs项目中,这样我就可以在多个项目中轻松使用它们。其中一个属性是webapi控制器,并确保请求使用HTTPS:
public class EnsureHttpsAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if(actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
if(actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
HandleNonHttpsRequest(actionContext);
}
}
protected virtual HttpResponseMessage HandleNonHttpsRequest(HttpActionContext actionContext)
{
HttpResponseMessage response = null;
if(actionContext.Request.Method.Equals(HttpMethod.Get) || actionContext.Request.Method.Equals(HttpMethod.Head))
{
UriBuilder newUrlBuilder = new UriBuilder(actionContext.Request.RequestUri);
newUrlBuilder.Scheme = Uri.UriSchemeHttps;
newUrlBuilder.Port = 443;
response = actionContext.Request.CreateResponse(HttpStatusCode.Found);
response.Headers.Location = newUrlBuilder.Uri;
}
else
{
response = actionContext.Request.CreateResponse(HttpStatusCode.NotFound);
}
actionContext.Response = response;
return response;
}
public System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<HttpResponseMessage>> continuation)
{
if(actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
if(actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
return Task.FromResult<HttpResponseMessage>(HandleNonHttpsRequest(actionContext));
}
else
{
return continuation();
}
}
}
然后我按如下方式添加属性:
config.Filters.Add(new EnsureHttpsAttribute());
问题是当属性是来自单独项目的引用时,它不会被调用。项目编译和运行没有问题 - 除了属性没有被执行。如果我将属性移动到同一个webapi项目中,该属性将被执行。我有其他属性使用声明来授权请求 - 这些属性不会在单独项目的一部分时执行。
以前有没有人经历过这个?
答案 0 :(得分:0)
应该可以将属性放在外部项目中。
请确保您在两个项目中使用相同的 System.Web.Http 和 System.Net.Http 版本。