外部程序集中的属性

问题描述:

我一直在将一些常见属性移动到单独的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

对我来说就像一个魅力,你确定你在两个项目中使用相同的System.Web.Http和System.Net.Http版本吗? – 2015-03-03 14:40:33

+0

@JosVinke感谢您的回复。我创建了一个新的web api项目,并尝试使用单独的项目 - 它按预期工作。我注意到,在这个新项目和原始版本中,System.Web.Http(4.0.0.0和5.2.3.0)的版本存在错误匹配 - 我更新了项目,以便它们都消耗5.2.3.0和一切都在工作。你知道为什么这可能导致了一个问题吗?我会期待一个例外。 – markpirvine 2015-03-04 08:14:47

+0

好现在阅读它的工作,但我不知道是什么原因造成的问题。从4.0.0.0版本到5.2.3.0版本的ActionFilterAttribute实现(例如添加Async方法)之间有相当大的区别,但我不确定导致问题的原因可能是HTTP管道中的某些更改。如果你知道,请让我知道。 – 2015-03-04 08:59:34

应该可以将您的属性放在一个外部项目中。

请确保您使用的是相同的System.Web.HttpSystem.Net.Http版本在两个项目。