Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês

Formatação HTTP Web do WCF

.NET Framework (current version)
 

O modelo de programação WCF Web HTTP permite determinar dinamicamente o melhor formato para retornar a resposta em uma operação de serviço. Há suporte para dois métodos para determinar um formato apropriado: automático e explícito.

Quando habilitado, formatação automática escolhe o melhor formato para retornar a resposta. Ele determina o melhor formato, verificando a seguir, em ordem:

  1. Os tipos de mídia no cabeçalho Accept da mensagem de solicitação.

  2. O tipo de conteúdo da mensagem de solicitação.

  3. O formato padrão definindo na operação.

  4. O formato padrão definindo em WebHttpBehavior.

Se a mensagem de solicitação contém um cabeçalho Accept de Windows Communication Foundation (WCF) pesquisas de infra-estrutura para um tipo que oferece suporte a ele. Se o Accept cabeçalho Especifica prioridades para seus tipos de mídia, elas são consideradas. Se nenhum formato adequado foi encontrado no Accept cabeçalho, o tipo de conteúdo da mensagem de solicitação é usado. Se nenhum tipo de conteúdo adequado for especificado, a configuração para a operação de formato padrão é usado. O formato padrão é definido com o ResponseFormat parâmetro o WebGetAttribute e WebInvokeAttribute atributos. Se nenhum formato padrão é especificado na operação, o valor de DefaultOutgoingResponseFormat propriedade é usada. Formatação automática depende do AutomaticFormatSelectionEnabled propriedade. Quando essa propriedade é definida como true, o WCF infra-estrutura determina o melhor formato para usar. Seleção automática de formato com versões anteriores é desabilitada por padrão para compatibilidade. Seleção automática de formato pode ser habilitada por meio de programação ou por meio da configuração. O exemplo a seguir mostra como habilitar a seleção automática de formato no 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());
  }


Formatação automática também pode ser habilitada por meio da configuração. Você pode definir o AutomaticFormatSelectionEnabled diretamente na propriedade de WebHttpBehavior ou usando o WebHttpEndpoint. O exemplo a seguir mostra como habilitar a seleção automática de formato no 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>

O exemplo a seguir mostra como habilitar a seleção automática de formato usando 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>

Como o nome implica, formatação explícita o desenvolvedor determina o melhor formato para usar dentro do código de operação. Se o melhor formato XML ou JSON o desenvolvedor define Format como Xml ou Json. Se o Format propriedade não está definida explicitamente, em seguida, o formato padrão da operação é usado.

O exemplo a seguir verifica se o parâmetro de cadeia de caracteres de consulta formato para um formato a ser usado. Se especificado, define a operação Formatar usando 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>(string.Format("Unsupported format '{0}'", formatQueryStringValue), HttpStatusCode.BadRequest);
            }
        }
        return "You said " + s;
    }

Se você precisar oferecer suporte a formatos diferentes de XML ou JSON, definir sua operação para ter um tipo de retorno de Message. Dentro do código de operação, determinar o formato apropriado para usar e, em seguida, criar um Message objeto usando um dos seguintes métodos:

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Cada um desses métodos usa conteúdo e cria uma mensagem com o formato apropriado. O WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements método pode ser usado para obter uma lista dos formatos preferido pelo cliente em ordem decrescente de preferência. O exemplo a seguir mostra como usar WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements para determinar o formato a ser usado e, em seguida, usa o método de resposta para criar a mensagem de resposta cria apropriado.


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);
    }
}

Mostrar: