在由 IIS 8.5 承载的 .NET WebAPI 2 中添加自定义标头

本文关键字:添加 自定义 WebAPI NET IIS 在由 | 更新日期: 2023-09-27 18:33:27

我用C#编写了一个WEBAPI应用程序,它在开发时运行良好,但是在由IIS 8.5托管的生产环境中,我遇到了问题。

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

[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;
}

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

HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/8.5
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Date: Fri, 05 Feb 2016 16:56:20 GMT
Content-Length: 0
Proxy-Connection: keep-alive

我知道可以在 IIS 中静态添加标头的密钥,但是在我的控制器中,我需要添加一个具有动态值的自定义标头:

res.Headers.Add("X-App-Limit-Remaining", getRemainingCalls());

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

非常感谢,

卢克

在由 IIS 8.5 承载的 .NET WebAPI 2 中添加自定义标头

可以使用

System.Net.Http.DelegatingHandler

参考:ASP.NET Web API 中的 HTTP 消息处理程序

可以将自定义处理程序添加到管道。消息处理程序很好 用于在 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;
        });        
    }
}

将处理程序添加到管道

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

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 示例。查看参考链接以获取更多示例。