Mat*_*Mav 5 c# asp.net azure asp.net-web-api azure-web-sites
我Web Api 2在Azure和AngularJsforntend 上托管了后端.我了解一些HTTP request使用预先检查OPTIONS request.我的问题是如何以这种方式实现后端,OPTIONS requests如果控制器中有一些将处理后续操作,则所有将返回200 GET/POST/PUT/DELETE/....
Vla*_*mir 14
解决此任务的非常优雅的方法是手动添加每个控制器
[AcceptVerbs("OPTIONS")]
public HttpResponseMessage Options()
{
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Headers.Add("Access-Control-Allow-Origin", "*");
resp.Headers.Add("Access-Control-Allow-Methods", "GET,DELETE");
return resp;
}
Run Code Online (Sandbox Code Playgroud)
或覆盖MessageHandlers
public class OptionsHttpMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Method == HttpMethod.Options)
{
var apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
var controllerRequested = request.GetRouteData().Values["controller"] as string;
var supportedMethods = apiExplorer.ApiDescriptions.Where(d =>
{
var controller = d.ActionDescriptor.ControllerDescriptor.ControllerName;
return string.Equals(
controller, controllerRequested, StringComparison.OrdinalIgnoreCase);
})
.Select(d => d.HttpMethod.Method)
.Distinct();
if (!supportedMethods.Any())
return Task.Factory.StartNew(
() => request.CreateResponse(HttpStatusCode.NotFound));
return Task.Factory.StartNew(() =>
{
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Headers.Add("Access-Control-Allow-Origin", "*");
resp.Headers.Add(
"Access-Control-Allow-Methods", string.Join(",", supportedMethods));
return resp;
});
}
return base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在配置中
GlobalConfiguration.Configuration.MessageHandlers.Add(new OptionsHttpMessageHandler());
Run Code Online (Sandbox Code Playgroud)
即便是第二种选择并不完美但是......没有原生的支持
我遇到了与您相同的问题,即所谓的Preflight请求,我发现这可能与Web.Conf文件上的配置错误有关。注释掉或删除包含OPTIONSVerbHandler的“删除”的行(如果存在)。
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<!--<remove name="OPTIONSVerbHandler" /> -->
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9092 次 |
| 最近记录: |