c# - servicestack REST API y CORS
(2)
Uso del complemento CorsFeature
Habilitar el soporte global de CORS
Ahora tenemos un CorsFeature que envuelve los encabezados de CORS en el Plugin continuación para que sea mucho más fácil agregar soporte de CORS a sus servicios de ServiceStack.
Comúnmente, esto es ahora todo lo que se necesita:
Plugins.Add(new CorsFeature());
Que usa los valores predeterminados:
CorsFeature(allowedOrigins:"*",
allowedMethods:"GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders:"Content-Type",
allowCredentials:false);
Puede omitir cualquiera de los valores que coincidan con el valor predeterminado. Por ejemplo, si solo desea restringir los métodos permitidos solo a las solicitudes GET y POST, puede hacer:
Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));
Habilite globalmente CORS para todas las solicitudes OPTION
Una vez que se registra CorsFeature (o cabeceras globales manuales), puede optar por habilitar CORS para todas las solicitudes OPTION agregando un filtro PreRequest para emitir todos los encabezados globales registrados (es decir, los encabezados en CorsFeature) y cortocircuitar todas las solicitudes OPTIONS con:
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;''
});
Habilitar el soporte CORS por servicio
En lugar de utilizar el complemento anterior, ServiceStack también le permite habilitar CORS por servicio utilizando el atributo [EnableCors] Response Filter, que tiene los mismos valores predeterminados que los anteriores. Por ejemplo, puede habilitar simplemente GET, POST como arriba con:
[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
Activando manualmente CORS
La belleza de ServiceStack es que está construido sobre un núcleo altamente flexible y simple. No intentamos construir API de tipo fuerte sobre todo, ya que es imposible predecir qué nuevos encabezados HTTP / StatusCodes existirán en el futuro. Por lo tanto, aunque proporcionamos un comportamiento conveniente para realizar tareas comunes, también ofrecemos una API flexible que le permite configurar cualquier salida HTTP deseada.
Establecer encabezados HTTP globales
Esta es la forma de habilitar Global Cross Sharing en su configuración de 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" },
},
});
}
Devolución de encabezados HTTP personalizados en un servicio
Estos encabezados se enviarán en cada solicitud, alternativamente, también puede habilitarlo para servicios web específicos, es decir, tomar el servicio web Hello World, por ejemplo:
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" }, }
};
}
}
Lo anterior es todo el código C # que necesita para desarrollar un servicio web que luego se conecta automáticamente para usted en todos los verbos HTTP (GET, POST, etc.) y puntos finales integrados, es decir, JSON, XML, JSV, HTML, CSV, SOAP 1.1 / 1.2 - gratis, sin ninguna configuración o fricción requerida. Verifique el ejemplo en vivo del servicio web anterior .
Además de los puntos finales anteriores, cada servicio está disponible para ser llamado por JSONP (otra forma popular de habilitar llamadas de servicio entre dominios en aplicaciones Ajax) donde cada servicio se puede llamar a través de JSONP simplemente agregando el parámetro ? Callback = cb a la cadena de consulta , p.ej:
http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/world?callback=cb
Este es otro ejemplo de la flexibilidad y la productividad que gana con el uso de ServiceStack, donde se le ofrece literalmente flexibilidad libre de fricción y libertad expresiva en su servicio web para devolver literalmente casi todo y se serializa como se esperaba.
No solo es más fácil de usar que WCF (con más funciones listas para usar) sino que también es mucho más rápido cuando todos sus componentes están altamente optimizados para obtener el máximo rendimiento .
¿Alguien sabe si el marco de la plataforma de servicios se puede usar para crear servicios CORS REST?
He estado golpeando mi cabeza contra las cosas WCF REST durante días, completamente inútil.
Gracias
Solo para tu información, ya que me costó trabajo averiguar dónde vivía el complemento CORS. Tal vez estoy solo grueso.
Está en ServiceStack.ServiceInterface.Cors
.