外部程序集中的属性
问题描述:
我一直在将一些常见属性移动到单独的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项目中,该属性将被执行。我还有其他使用声明来授权请求的属性 - 这些属性不会在单独项目的一部分中执行。
有没有人遇到过这个?
答
应该可以将您的属性放在一个外部项目中。
请确保您使用的是相同的System.Web.Http和System.Net.Http版本在两个项目。
对我来说就像一个魅力,你确定你在两个项目中使用相同的System.Web.Http和System.Net.Http版本吗? – 2015-03-03 14:40:33
@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
好现在阅读它的工作,但我不知道是什么原因造成的问题。从4.0.0.0版本到5.2.3.0版本的ActionFilterAttribute实现(例如添加Async方法)之间有相当大的区别,但我不确定导致问题的原因可能是HTTP管道中的某些更改。如果你知道,请让我知道。 – 2015-03-04 08:59:34