que framework dell c# .net servicestack

c# - framework - Formato predeterminado de ServiceStack



servicestack price (3)

Me gustaría establecer el formato predeterminado de ServiceStack en JSON, en lugar de la respuesta en formato HTML que normalmente devuelve cuando se accede a un servicio desde un navegador. Sé que esto se puede especificar en cada solicitud enviando un parámetro? Format = json o configurando el encabezado Aceptar en application / json. ¿Hay alguna manera de cambiar esto sin tener que confiar en estas sugerencias de la solicitud?


Tarde en la pregunta, pero como no pude encontrar la respuesta en ningún lugar, finalmente me di cuenta del código fuente de ServiceStack :)

La forma más sencilla que encontré de establecer de forma predeterminada Json en lugar de Html desde el navegador fue esta:

HttpRequestExtensions.PreferredContentTypes = new[] { MimeTypes.Json, MimeTypes.Xml };

Llámelo al inicio de su aplicación, que anulará los tipos de mimo de ServiceStack predeterminados y comenzará con json (que funcionará con las solicitudes de su navegador ya que coincidirá).

Tenga en cuenta que aún debe desactivar Html y hacer que Json sea el tipo mime predeterminado:

SetConfig(new HostConfig { DefaultContentType = MimeTypes.Json EnableFeatures = Feature.All.Remove(Feature.Html), });

Para los curiosos : ServiceStack utiliza internamente HttpRequestExtensions.GetResponseContentType (consulte HttpRequestExtensions.cs ), que recorre los tipos de contenido preferidos. Debido a que contiene MimeTypes.Html , detectará el primer tipo de aceptación desde el navegador ( text/html ) e ignorará lo que venga después. Al anular esto, text/html no se ve como un tipo de contenido preferido, y luego salta a */* que de forma predeterminada es json como se esperaba.


Utilizo PreRequestFilter para forzar las respuestas JSON a un navegador. Aún ves el? Format = json en la cadena de consulta, pero es útil si has deshabilitado html y xml.

this.PreRequestFilters.Add( (req, res) => { const string queryString = "format=json"; var jsonAccepted = req.AcceptTypes.Any(t => t.Equals(ContentType.Json, StringComparison.InvariantCultureIgnoreCase)); var jsonSpecifiedOnQuerystring = !string.IsNullOrEmpty(req.QueryString["format"]) && req.QueryString["format"].Equals("json", StringComparison.InvariantCultureIgnoreCase); if (!jsonAccepted && !jsonSpecifiedOnQuerystring) { var sb = new StringBuilder(req.AbsoluteUri); sb.Append(req.AbsoluteUri.Contains("?") ? "&" : "?"); sb.Append(queryString); res.RedirectToUrl(sb.ToString(), HttpStatusCode.SeeOther); res.Close(); } });


Además de especificarlo en QueryString con ? Format = json , agregando el formato .ext al final de la ruta, por ejemplo: /rockstars.json , o especificando el encabezado HTTP (en su HttpClient): Accept: application/json

De lo contrario, si su HttpClient no envía un encabezado de aceptación, puede especificar JSON como el tipo de contenido predeterminado en su AppHost con:

SetConfig(new HostConfig { DefaultContentType = MimeTypes.Json });

Todas las opciones de configuración en ServiceStack se establecen aquí.

El problema al llamar a los servicios web desde un navegador web es que normalmente solicitan Accept: text/html y no JSON, lo que por contrato ServiceStack obliga al devolver el código HTML si está habilitado.

Para asegurarse de que se devuelva JSON, es posible que también desee desactivar la función HTML con:

SetConfig(new HostConfig { EnableFeatures = Feature.All.Remove(Feature.Html), });

Diferentes maneras de especificar el tipo de contenido de respuesta

De lo contrario, si desea anular el encabezado Aceptar, puede obligar a su servicio a devolver siempre json con cualquiera de estas formas de personalizar la respuesta HTTP , por ejemplo:

Usando un filtro (AddHeader está incorporado):

[AddHeader(ContentType=MimeTypes.Json)] public object Any(Request request) { ... }

Configuración de la respuesta en el servicio:

public object Any(Request request) { base.Response.ContentType = MimeTypes.Json; return dto; }

Devolviendo una respuesta decorada:

return new HttpResult(dto, MimeTypes.Json);