servicestack,restapi,C#,Rest,Cors,servicestack,Restapi" /> servicestack,restapi,C#,Rest,Cors,servicestack,Restapi" />

C# ServiceStack REST API和CORS

C# ServiceStack REST API和CORS,c#,rest,cors,servicestack,restapi,C#,Rest,Cors,servicestack,Restapi,有人知道ServiceStack框架是否可以用于创建CORS REST服务吗 几天来,我一直在用脑袋撞WCF REST的东西——完全没有用。使用CorsFeature插件 启用全球CORS支持 我们现在有了一个CorsFeature,它将CORS头包装到下面,以便更容易地将CORS支持添加到ServiceStack服务中 通常,这就是现在所需要的: Plugins.Add(new CorsFeature()); 它使用默认值: CorsFeature(allowedOrigins:"*",

有人知道ServiceStack框架是否可以用于创建CORS REST服务吗

几天来,我一直在用脑袋撞WCF REST的东西——完全没有用。

使用CorsFeature插件 启用全球CORS支持 我们现在有了一个CorsFeature,它将CORS头包装到下面,以便更容易地将CORS支持添加到ServiceStack服务中

通常,这就是现在所需要的:

Plugins.Add(new CorsFeature());
它使用默认值:

CorsFeature(allowedOrigins:"*", 
    allowedMethods:"GET, POST, PUT, DELETE, OPTIONS", 
    allowedHeaders:"Content-Type", 
    allowCredentials:false);
您可以省略任何与默认值匹配的值。例如,如果您只想将允许的方法限制为仅获取和发布请求,则可以执行以下操作:

Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));
全局启用所有选项请求的CORS 注册CorsFeature(或手动全局标头)后,您可以选择为所有选项请求启用CORS,方法是添加请求前筛选器以发出所有已注册的全局标头(即CorsFeature中的标头),并使用以下命令短接所有选项请求:

this.PreRequestFilters.Add((httpReq, httpRes) => {
    //Handles Request and closes Responses after emitting global HTTP Headers
    if (httpReq.Method == "OPTIONS") 
        httpRes.EndRequest(); //add a 'using ServiceStack;'
});
支持每个服务启用CORS 除了使用上面的插件,ServiceStack还允许您使用具有与上面相同默认值的[EnableCors]在每个服务的基础上启用CORS。例如,您可以使用以下工具启用上述“仅获取、发布”功能:

[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
手动启用CORS 它的美妙之处在于它构建在一个高度灵活和简单的内核上。我们并不试图在所有内容上构建强类型API,因为不可能预测将来会出现哪些新的HTTP头/状态码。因此,在我们提供方便的行为来完成常见任务的同时,我们还提供了一个灵活的API,允许您配置任何所需的HTTP输出

设置全局HTTP头 以下是如何在AppHost配置中全局启用跨源共享:

public override void Configure(Container container)
{
    //Permit modern browsers (e.g. Firefox) to allow sending of any REST HTTP Method
    base.SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type" },
        },
    });
}
在服务中返回自定义HTTP头 这些标头将在每次请求时发送,或者您也可以为特定的web服务启用它,例如:

public class Hello {
    public string Name { get; set; }
}

public class HelloResponse {
    public string Result { get; set; }
}

public class HelloService : IService 
{
    public object Any(Hello request)
    {
        var dto = new HelloResponse { Result = "Hello, " + request.Name };
        return new HttpResult(dto) {
            Headers = {
              { "Access-Control-Allow-Origin", "*" },
              { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" } 
              { "Access-Control-Allow-Headers", "Content-Type" }, }
        };
    }
}
以上是开发web服务所需的全部C#代码,该服务将自动连接到所有HTTP谓词(GET、POST等)和内置端点(即JSON、XML、JSV、HTML、CSV、SOAP1.1/1.2)上,无需任何配置或摩擦即可免费使用。结帐

除了上述端点之外,JSONP还可以调用每个服务(Ajax应用程序中启用跨域服务调用的另一种流行方式),其中每个服务都可以通过JSONP调用,只需将?callback=cb参数添加到querystring中,例如:

这是另一个使用ServiceStack的灵活性和生产力胜利的例子,在这里,您的web服务实际上被赋予了无摩擦的灵活性和表达自由,并按预期进行了序列化


它不仅比WCF更容易使用(有更多的现成功能),而且在哪里也要快得多。

仅供参考,因为我很难弄清楚CORS插件的位置。也许我只是太胖了


它位于
ServiceStack.ServiceInterface.Cors

中,我尝试过使用wcf rest初学者工具包和(给出的属性和第一个不理想的代码示例)我不断得到:访问控制不允许使用Origin Allow Origin。我认为chrome网络控制台错误地报告了一个已取消的请求-fiddler没有显示相同的结果-它说它已完成ok…你能解释一下选项请求的管道吗?有人猜测为什么不返回头,以及为什么每当我实现请求过滤器时都会返回404吗?你能问一个新问题,解释你的问题,并提供请求过滤器的impl及其前后效果吗。提供所需的尽可能多的相关代码来重新编程,thx。也许我做错了什么,但是服务类型上的
[EnableCors(allowedMethods:“GET,POST”)]
似乎不起作用。如果我移动它并将其放在
Get()
Options()
方法上,那么它确实有效。@mythz我已经将
PreRequestFilters
添加到了我的AppHost.cs中,如您所示,但我的POST请求仍然没有得到它们需要的标题。它们是这样设置的:--我在同一个文件中有一个GET请求,设置方式相同,效果很好。请让我知道我是否可以提供更多信息。有没有一种简单的方法可以允许允许为AllowedHeader提供任何标题,而不单独列出每个标题?这就是为什么我喜欢resharper:)