外部程序集中的属性
Attributes in External Assemblies
我一直在把一些通用的属性移到一个单独的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 版本。
我一直在把一些通用的属性移到一个单独的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 版本。