请问ServiceStack框架是否可以用于创建支持CORS的REST服务?
我已经为WCF REST的相关问题苦苦挣扎了好几天,但完全没有用。
请问ServiceStack框架是否可以用于创建支持CORS的REST服务?
我已经为WCF REST的相关问题苦苦挣扎了好几天,但完全没有用。
现在我们有一个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"));
一旦注册了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;'
});
除了使用上面提到的插件之外,ServiceStack还允许您通过使用[EnableCors]响应过滤器属性在每个服务上启用CORS,该属性具有与上述相同的默认值。例如,您可以像上面那样仅启用GET、POST:
[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
ServiceStack之美在于它建立在高度灵活和简单的核心之上。我们不尝试在所有内容上构建强类型API,因为无法预测未来会存在哪些新的HTTP Headers / StatusCodes。因此,虽然我们提供了方便的行为以完成常见任务,但我们也提供了一个灵活的API,让您配置任何所需的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" },
},
});
}
这些头信息将在每个请求中发送,或者您也可以为特定的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" }, }
};
}
}
以上是你需要开发 Web 服务所需的全部 C#代码,然后自动对所有 HTTP 动词(GET、POST 等)和内置终结点进行连接,即 JSON、XML、JSV、HTML、CSV、SOAP 1.1/1.2 - 免费提供,无需任何配置或摩擦。请查看上面的 Web 服务实时示例。[EnableCors(allowedMethods:"GET,POST")]
似乎不起作用。如果我将其移动并放置在Get()
和Options()
方法上,则可以正常工作。 - Adam RalphPreRequestFilters
,但是我的 POST 请求仍然没有得到它们所需的标头。 它们的设置如下:https://gist.github.com/JaKXz/8fd6ec1dda2f1b6aef0a --我在同一文件中设置了一个 GET 请求,设置方式相同,可以正常工作。 如果需要更多信息,请告诉我。 - JaKXzCorsFeature
默认情况下会将它们全部注册,如上面的默认值所示。 - mythz提醒一下,我花了不少时间才找到CORS插件的位置。也许是我太蠢了。
它在ServiceStack.ServiceInterface.Cors
中。