2012-11-20 33 views
1

我试图添加一个标头属性到控制器,但响应为HttpActionContext属性为空。难道我做错了什么?添加标头到控制器上的Web API操作

Controller.cs

[ExceptionHandling, ApiValidation, HttpHeader("X-Robots-Tag", "noindex, nofollow")] 
    public abstract class BaseApiController : System.Web.Http.ApiController 
    { 

HttpHeaderFilter.cs

public class HttpHeaderAttribute : System.Web.Http.Filters.FilterAttribute 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 

    public HttpHeaderAttribute(string name, string value) 
    { 
     Name = name; 
     Value = value; 
    } 
} 

public class HttpHeaderFilter : System.Web.Http.Filters.IActionFilter 
{ 
    private readonly string _name; 
    private readonly string _value; 

    public HttpHeaderFilter(string name, string value) 
    { 
     _name = name; 
     _value = value; 
    } 

    public bool AllowMultiple 
    { 
     get { return true; } 
    } 

    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) 
    { 
     actionContext.Response.Headers.Add(_name, _value); 

     return continuation(); 
    } 
} 

的Global.asax

kernel.BindHttpFilter<HttpHeaderFilter>(System.Web.Http.Filters.FilterScope.Controller) 
         .WhenControllerHas<HttpHeaderAttribute>() 
         .WithConstructorArgumentFromControllerAttribute<HttpHeaderAttribute>("name", q => q.Name) 
         .WithConstructorArgumentFromControllerAttribute<HttpHeaderAttribute>("value", q => q.Value); 

回答

3

这将是简单r让你从web api的ActionFiterAttribute类派生出来,并将这个头添加到响应中,而不是使用IActionFilter从头开始实现一个动作过滤器。

[编辑] 对于上述方案,尝试做如下:

return continuation().ContinueWith<HttpResponseMessage>((tsk) => 
       { 
        HttpResponseMessage response = tsk.Result; 

        response.Headers.Add(...) 

        return response; 

       }, TaskContinuationOptions.OnlyOnRanToCompletion); 
+0

我想我应该我使用Ninject提到,所以我必须使用此设置。 –

+0

非常感谢你 –

相关问题