【问题标题】:OPTIONS Verb for Routes with custom CORS headers带有自定义 CORS 标头的路由的选项动词
【发布时间】:2013-04-28 06:00:51
【问题描述】:

假设我有这样的路线:

[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 时,这种行为看起来是不正确的,所以我暂时使用一个子类属性,它只是自动将 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)) {}
}

【问题讨论】:

    标签: routing servicestack


    【解决方案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();
    });
    

    【讨论】:

    • 所以我把这个放进去,但它不起作用。问题是,如果路由指定了一个动词(如GET),则该过滤器永远不会针对 OPTIONS,仅针对 GET。如果我将 OPTIONS 添加到 Route Verbs,则会命中该过滤器。 Route 动词似乎甚至优先于 PreRequestFilters
    • 好奇怪 - 会检查一下,它肯定适用于普通 RequestFilters,刚刚更新了使用 RequestFilters 的答案。
    • 我之前用的是RequestFilters,他们都做同样的事情。请记住,测试 OPTIONS 请求仅在您有自定义标头时才会发出。没有自定义标题也可以正常工作。
    • 我把PreRequestFiltersRequestFilters都放进去,Pre肯定会先被命中,但它们仍然只有在OPTIONS已经是路由动词时才会被命中。
    • 对它仍然需要匹配一个有效的路由,你也可以在AppHost.CatchAllHandlers 中注册它,它被称为非匹配路由的后备 - 你可以使用它来劫持通过检测并返回自定义IHttpHandler 的HTTP 请求。
    猜你喜欢
    • 2014-01-14
    • 2016-04-05
    • 2020-12-16
    • 2020-09-10
    • 2017-12-28
    • 2011-03-03
    • 2014-02-18
    • 2021-05-22
    • 2012-11-24
    相关资源
    最近更新 更多