外部程序集中的属性

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.HttpSystem.Net.Http 版本。