服务堆REST API和CORS
任何人都知道是否可以使用servicestack框架来创建CORS REST服务?
我几天来一直对WCF REST的东西感兴趣 - 完全没用。
谢谢
使用CorsFeature插件
启用全球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(或手动全局标题),您可以选择为所有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] Response Filter属性来启用CORS,该属性具有与上述相同的默认值。 例如,您可以使用以下方式启用GET,POST:
[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
手动启用CORS
ServiceStack的优点在于它建立在一个高度灵活和简单的核心上。 我们不会尝试构建强类型的API,因为不可能预测未来会有什么新的HTTP Headers / 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" },
},
});
}
返回服务中的自定义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" }, }
};
}
}
以上是开发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更易于使用(具有更多的功能),而且它的所有组件都经过高度优化以实现最高性能,所以速度也更快。
只是FYI,因为我很难弄清CORS插件的居住地。 也许我只是很厚。
它在ServiceStack.ServiceInterface.Cors
。