一尘不染

服务堆栈REST API和CORS

c#

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

几天来,我一直在对WCF REST东西ha之以鼻-完全没用。

谢谢


阅读 273

收藏
2020-05-19

共1个答案

一尘不染

使用CorsFeature插件

启用Global CORS支持

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

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

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(或手动全局标题),您可以选择通过添加PreRequest过滤器以发出所有已注册的全局标题(即CorsFeature中的标题)并使用以下方法使所有
OPTIONS* 短路来选择为所有 OPTION 请求启用CORS : *

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] Response
Filter属性
来启用每个服务的CORS,该属性具有与上述相同的默认值。例如,您可以通过以下方式仅启用GET,POST:

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

手动启用CORS

的美女ServiceStack是,它是建立在一个高度灵活和简单的核心。我们不会尝试在所有内容上构建强类型的API,因为无法预测将来会出现哪些新的HTTP标头/
StatusCode。因此,尽管我们提供方便的行为来完成常见任务,但我们还提供了灵活的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易于使用(具有更多现成的功能),而且在对其所有组件进行高度优化以实现最佳性能的情况下它也要快得多。

2020-05-19