47

有谁知道 ServiceStack 框架是否可以用来创建 CORS REST 服务?

几天来,我一直在抨击 WCF REST 的东西——完全没用。

4

2 回答 2

87

使用 CorsFeature 插件

启用全球 CORS 支持

我们现在有一个CorsFeature,它将 CORS 标头包装到下面的插件中,以便更容易地将 CORS 支持添加到您的 ServiceStack 服务中。

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

Plugins.Add(new CorsFeature());

其中使用默认值:

CorsFeature(allowedOrigins:"*", 
    allowedMethods:"GET, POST, PUT, DELETE, OPTIONS", 
    allowedHeaders:"Content-Type", 
    allowCredentials:false);

您可以省略任何与默认值匹配的值。例如,如果您只想将允许的方法限制为 GET 和 POST 请求,您可以这样做:

Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));

为所有 OPTION 请求全局启用 CORS

注册 CorsFeature(或手动全局标头)后,您可以选择为所有OPTION请求启用 CORS,方法是添加 PreRequest 过滤器以发出所有已注册的全局标头(即 CorsFeature 中的标头)并使用以下命令短路所有OPTIONS请求:

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 。例如,您可以只启用 GET、POST,如上:

[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }

手动启用 CORS

ServiceStack的美妙之处在于它建立在一个高度灵活且简单的核心之上。我们不会尝试在所有内容上构建强类型 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 服务启用它,即以Hello World 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、 SOAP 1.1/1.2 - 免费,无需任何配置或摩擦。查看 上述 Web 服务的实时示例

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

http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/world?callback=cb

这是使用 ServiceStack 获得灵活性和生产力优势的另一个示例,您在 Web 服务中获得了无摩擦的灵活性和表达自由,可以真正返回几乎任何内容,并按预期进行序列化。

它不仅比 WCF 更易于使用(具有更多开箱即用的功能),而且它的所有组件都经过高度优化以获得最佳性能,而且速度也快得多。

于 2011-11-21T17:19:06.143 回答
7

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

它在ServiceStack.ServiceInterface.Cors

于 2012-12-12T00:00:30.560 回答