Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El modelo de programación HTTP web de WCF permite determinar dinámicamente el mejor formato para que una operación de servicio devuelva su respuesta. Se admiten dos métodos para determinar un formato adecuado: automático y explícito.
Formato automático
Cuando se habilita, el formato automático elige el mejor formato en el que devolver la respuesta. Determina el mejor formato comprobando lo siguiente, en orden:
Los tipos multimedia del encabezado Accept del mensaje de solicitud.
Tipo de contenido del mensaje de solicitud.
Configuración de formato predeterminada en la operación.
Configuración de formato predeterminada en WebHttpBehavior.
Si el mensaje de solicitud contiene un encabezado Accept, la infraestructura de Windows Communication Foundation (WCF) busca un tipo que admita. Si el Accept
encabezado especifica prioridades para sus tipos multimedia, se respetan. Si no se encuentra ningún formato adecuado en el Accept
encabezado, se usa el tipo de contenido del mensaje de solicitud. Si no se especifica ningún tipo de contenido adecuado, se usa la configuración de formato predeterminada para la operación. El formato predeterminado se establece con el ResponseFormat
parámetro de los WebGetAttribute atributos y WebInvokeAttribute . Si no se especifica ningún formato predeterminado en la operación, se usa el valor de la DefaultOutgoingResponseFormat propiedad . El formato automático se basa en la AutomaticFormatSelectionEnabled propiedad . Cuando esta propiedad se establece true
en , la infraestructura de WCF determina el mejor formato que se va a usar. La selección de formato automático está deshabilitada de forma predeterminada para la compatibilidad con versiones anteriores. La selección de formato automático se puede habilitar mediante programación o a través de la configuración. En el ejemplo siguiente se muestra cómo habilitar la selección automática de formato en el código.
// This code assumes the service name is MyService and the service contract is IMyContract
Uri baseAddress = new Uri("http://localhost:8000");
WebServiceHost host = new WebServiceHost(typeof(MyService), baseAddress)
try
{
ServiceEndpoint sep = host.AddServiceEndpoint(typeof(IMyContract), new WebHttpBinding(), "");
// Check it see if the WebHttpBehavior already exists
WebHttpBehavior whb = sep.Behaviors.Find<WebHttpBehavior>();
if (whb != null)
{
whb.AutomaticFormatSelectionEnabled = true;
}
else
{
WebHttpBehavior webBehavior = new WebHttpBehavior();
webBehavior.AutomaticFormatSelectionEnabled = true;
sep.Behaviors.Add(webBehavior);
}
// Open host to start listening for messages
host.Open();
// ...
}
catch(CommunicationException ex)
{
Console.WriteLine("An exception occurred: " + ex.Message());
}
El formato automático también se puede habilitar a través de la configuración. Puede establecer la AutomaticFormatSelectionEnabled propiedad directamente en WebHttpBehavior o mediante .WebHttpEndpoint En el ejemplo siguiente se muestra cómo habilitar la selección de formato automático en .WebHttpBehavior
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp automaticFormatSelectionEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<standardEndpoints>
<webHttpEndpoint>
<!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. -->
<standardEndpoint name="" helpEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
En el ejemplo siguiente se muestra cómo habilitar la selección automática de formato mediante WebHttpEndpoint.
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. -->
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Formato explícito
Como el nombre implica, en formato explícito, el desarrollador determina el mejor formato que se usará en el código de operación. Si el mejor formato es XML o JSON, el desarrollador establece Format en Xml o Json. Si la Format propiedad no se establece explícitamente, se usa el formato predeterminado de la operación.
En el ejemplo siguiente se comprueba el parámetro de cadena de consulta de formato para un formato que se va a usar. Si se ha especificado, establece el formato de la operación mediante Format.
public class Service : IService
{
[WebGet]
public string EchoWithGet(string s)
{
// if a format query string parameter has been specified, set the response format to that. If no such
// query string parameter exists the Accept header will be used
string formatQueryStringValue = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["format"];
if (!string.IsNullOrEmpty(formatQueryStringValue))
{
if (formatQueryStringValue.Equals("xml", System.StringComparison.OrdinalIgnoreCase))
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Xml;
}
else if (formatQueryStringValue.Equals("json", System.StringComparison.OrdinalIgnoreCase))
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
}
else
{
throw new WebFaultException<string>($"Unsupported format '{formatQueryStringValue}'", HttpStatusCode.BadRequest);
}
}
return "You said " + s;
}
Si necesita admitir formatos distintos de XML o JSON, defina la operación para que tenga un tipo de valor devuelto de Message. Dentro del código de operación, determine el formato adecuado para usar y, a continuación, cree un Message objeto mediante uno de los métodos siguientes:
WebOperationContext.CreateAtom10Response
WebOperationContext.CreateJsonResponse
WebOperationContext.CreateStreamResponse
WebOperationContext.CreateTextResponse
WebOperationContext.CreateXmlResponse
Cada uno de estos métodos toma contenido y crea un mensaje con el formato adecuado. El WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
método se puede usar para obtener una lista de formatos preferidos por el cliente en orden de disminución de preferencias. En el ejemplo siguiente se muestra cómo usar WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
para determinar el formato que se va a usar y, a continuación, se usa el método de creación de respuesta adecuado para crear el mensaje de respuesta.
public class Service : IService
{
public Message EchoListWithGet(string list)
{
List<string> returnList = new List<string>(list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
IList<ContentType> acceptHeaderElements = WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements();
for (int x = 0; x < acceptHeaderElements.Count; x++)
{
string normalizedMediaType = acceptHeaderElements[x].MediaType.ToLowerInvariant();
switch (normalizedMediaType)
{
case "image/jpeg": return CreateJpegResponse(returnList);
case "application/xhtml+xml": return CreateXhtmlResponse(returnList);
case "application/atom+xml": return CreateAtom10Response(returnList);
case "application/xml": return CreateXmlResponse(returnList);
case "application/json": return CreateJsonResponse(returnList);
}
}
// Default response format is XML
return CreateXmlResponse(returnList);
}
}