我有一个使用 CorsFeature 的服务设置,并且正在使用 mythz 在其他答案中建议的方法,收集在 appHost 文件中使用的函数中:
private void ConfigureCors(Funq.Container container)
{
Plugins.Add(new CorsFeature(allowedOrigins: "*",
allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders: "Content-Type, Authorization, Accept",
allowCredentials: true));
PreRequestFilters.Add((httpReq, httpRes) =>
{
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.HttpMethod == "OPTIONS")
{
httpRes.EndRequest();
}
});
}
但是,预请求过滤器仅在某些服务请求上触发。我们在服务中拥有的基础实体之一是问题实体,自定义路由定义如下:
[Route("/question")]
[Route("/question/{ReviewQuestionId}", "GET,DELETE")]
[Route("/question/{ReviewQuestionId}/{ReviewSectionId}", "GET")]
使用 POSTMAN 触发测试查询(全部使用 OPTIONS 动词),我们可以看到这将触发预请求过滤器:
http://localhost/myservice/api/question/
但这不会:
http://localhost/myservice/api/question/66
据推测,这是因为第二条和第三条路线明确定义了它们接受的动词,而 OPTIONS 不是其中之一。
真的有必要在限制支持的动词的每个定义的路线中拼出 OPTIONS 吗?