选项用于具有自定义CORS标头的路由的动词

时间:2013-05-03 18:40:50

标签: routing servicestack

假设我有这样的路线:

[Route("/users/{Id}", "DELETE")]
public class DeleteUser
{
    public Guid Id { get; set; }
}

如果我将CORS与自定义标头一起使用,则会发出OPTIONS预检请求。这将发生在所有请求上。使用上述路由,路由将触发,但OPTIONS将为404,并且将触发ajax错误处理程序。

我可以将路线修改为[Route("/users/{Id}", "DELETE OPTIONS")],但我需要在我的每条路线上执行此操作。有没有办法全局允许所有自定义路线的OPTIONS?

修改

由于当RequestFilter允许OPTIONS时看起来这种行为不正确,我暂时使用了一个Subclassed属性,它只是自动为动词添加OPTIONS

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ServiceRoute : RouteAttribute
{
    public ServiceRoute(string path) : base(path) {}
    public ServiceRoute(string path, string verbs) 
           : base(path, string.Format("{0} OPTIONS", verbs)) {}
}

1 个答案:

答案 0 :(得分:1)

如此earlier answer所示,您可以通过添加CorsFeature插件为所有选项请求添加全局启用CORS:

Plugins.Add(new CorsFeature()); //Registers global CORS Headers

如果您愿意,可以直接添加PreRequest过滤器以发出所有全局标头(例如在CorsFeature中注册)并使用以下命令将所有 OPTIONS 请求短路:

this.RequestFilters.Add((httpReq, httpRes, requestDto) => {
   //Handles Request and closes Responses after emitting global HTTP Headers
    if (httpReq.Method == "OPTIONS") 
        httpRes.EndServiceStackRequest();
});