我用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标头。
非常感谢,
路
答案 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 示例。查看引用的链接以获取更多示例。