在由 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标头。
非常感谢,
卢克
可以使用
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 示例。查看参考链接以获取更多示例。