servicestack REST API和CORS

46 c# api rest cors servicestack

任何人都知道servicestack框架是否可用于创建CORS REST服务?

我几天来一直在抨击WCF REST的东西 - 完全没用.

谢谢

myt*_*thz 87

使用CorsFeature插件

启用全局CORS支持

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

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

Plugins.Add(new CorsFeature());
Run Code Online (Sandbox Code Playgroud)

其中使用默认值:

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

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

Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));
Run Code Online (Sandbox Code Playgroud)

全局为所有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;'
});
Run Code Online (Sandbox Code Playgroud)

启用CORS每服务支持

ServiceStack不是使用上面的插件,而是允许您通过使用[EnableCors] 响应过滤器属性在每个服务的基础上启用CORS,该属性具有与上面相同的默认值.例如,您可以按上述方式启用GET,POST:

[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
Run Code Online (Sandbox Code Playgroud)

手动启用CORS

的美女ServiceStack是,它是建立在一个高度灵活和简单的核心.我们不会尝试在所有内容上构建强类型API,因为无法预测将来会出现什么新的HTTP标头/ StatusCodes.因此,虽然我们提供了方便的行为来完成常见任务,但我们还提供了一个灵活的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" },
        },
    });
}
Run Code Online (Sandbox Code Playgroud)

在服务中返回自定义HTTP标头

这些标头将在每次请求时发送,或者您也可以为特定的Web服务启用它,例如,以Hello World Web Service为例:

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" }, }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

以上是开发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更容易使用(具有开箱即用的更多功能),而且在所有组件都经过高度优化以获得最佳性能的同时,它也更快.

  • 也许我做错了,但服务类型上的`[EnableCors(allowedMethods:"GET,POST")]`似乎不起作用.如果我移动它并把它放在`Get()`和`Options()`方法上,那么它*可以*工作. (2认同)

Tys*_*alp 7

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

它在ServiceStack.ServiceInterface.Cors.

  • 这就是为什么我喜欢resharper :) (3认同)