在IIS 8.5托管的.NET WebAPI 2中添加自定义标头

时间:2016-02-05 17:39:37

标签: c# asp.net asp.net-web-api iis-8.5

我用C#编写了一个WEBAPI应用程序,在开发时工作正常但在生产时,由IIS 8.5托管我遇到了问题。

为了在我的控制器中启用CORS(跨源资源共享),我实现了OPTION操作:

updateTextInput

正如我之前所写,在Visual Studio上一切正常但在生产中,当我使用Fiddler发出OPTIONS请求时,答案总是如此:

textInput

我知道可以在IIS中静态添加Header的密钥,但是在我的控制器中,我需要添加一个带有动态值的Custome Header:

[HttpOptions]
[AllowAnonymous]
public HttpResponseMessage Options()
{
    HttpResponseMessage res = new HttpResponseMessage();

    res.Headers.Add("Access-Control-Allow-Headers", "User-Agent, Content-Type, Accept, X-ApplicationId, Authorization, Host, Content-Length");
    res.Headers.Add("Access-Control-Allow-Methods", "POST");
    res.Headers.Add("Access-Control-Allow-Origin", "*");
    res.StatusCode = HttpStatusCode.OK;
    return res;
}

任何人都知道如何从IIS 8托管的C#WEB API覆盖/更改HTTP标头。

非常感谢,

1 个答案:

答案 0 :(得分:1)

您可以使用System.Net.Http.DelegatingHandler

进入请求管道

参考:HTTP Message Handlers in ASP.NET Web API

  

您可以向管道添加自定义处理程序。消息处理程序很好   用于在HTTP消息级别运行的跨领域关注点   (而不是控制器动作)。例如,消息处理程序   可能:

     
      
  • 阅读或修改请求标题。
  •   
  • 在回复中添加回复标题。
  •   
  • 在请求到达控制器之前验证请求。
  •   

这里使用您的速率限制示例是一个简化的处理程序:

public class WebApiRateLimitHandler : DelegatingHandler {

    //Override the SendAsync Method to tap into request pipeline
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        Debug.WriteLine("Process request");
        // Call the inner handler.
        Task<HttpResponseMessage> response = base.SendAsync(request, cancellationToken);
        Debug.WriteLine("Process response");
        return response.ContinueWith(task => {
            var httpResponse = task.Result;
            httpResponse.Headers.Add("X-App-Limit-Remaining", getRemainingCalls());
            return httpResponse;
        });        
    }
}

向管道添加处理程序

  

消息处理程序的调用顺序与它们出现的顺序相同   MessageHandlers集合。因为它们是嵌套的,所以响应   消息向另一个方向传播。也就是说,最后一个处理程序是   第一个收到回复消息。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        //Order handlers are added is important. First in last out
        config.MessageHandlers.Add(new WebApiRateLimitHandler());
        config.MessageHandlers.Add(new SomeOtherMessageHandler());

        // Other code not shown...
    }
}

还有 X-HTTP-Method-Override 示例。查看引用的链接以获取更多示例。