外部装配中的属性

时间:2015-03-03 13:20:32

标签: asp.net-web-api

我一直将一些常见属性移动到一个单独的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项目中,该属性将被执行。我有其他属性使用声明来授权请求​​ - 这些属性不会在单独项目的一部分时执行。

以前有没有人经历过这个?

1 个答案:

答案 0 :(得分:0)

应该可以将属性放在外部项目中。

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