Sdílet prostřednictvím


Formátování webového protokolu HTTP WCF

Programovací model WEBOVÉHO PROTOKOLU HTTP WCF umožňuje dynamicky určit nejlepší formát pro operaci služby, aby vrátila odpověď. Podporují se dvě metody určení vhodného formátu: automatické a explicitní.

Automatické formátování

Pokud je tato možnost povolená, automatické formátování zvolí nejlepší formát, ve kterém se má odpověď vrátit. Určuje nejlepší formát kontrolou následujícího pořadí:

  1. Typy médií v hlavičce Accept zprávy požadavku.

  2. Typ obsahu zprávy požadavku.

  3. Výchozí nastavení formátu v operaci.

  4. Výchozí nastavení formátu v WebHttpBehavior.

Pokud zpráva požadavku obsahuje hlavičku Accept, infrastruktura WCF (Windows Communication Foundation) vyhledá typ, který podporuje. Accept Pokud záhlaví určuje priority pro své typy médií, jsou dodrženy. Pokud se v Accept hlavičce nenajde vhodný formát, použije se typ obsahu zprávy požadavku. Pokud není zadán vhodný typ obsahu, použije se výchozí nastavení formátu operace. Výchozí formát je nastaven s parametrem ResponseFormatWebGetAttribute a WebInvokeAttribute atributy. Pokud není pro operaci zadán žádný výchozí formát, použije se hodnota DefaultOutgoingResponseFormat vlastnosti. Automatické formátování závisí na AutomaticFormatSelectionEnabled vlastnosti. Pokud je tato vlastnost nastavena na true, infrastruktura WCF určuje nejlepší formát, který se má použít. Automatický výběr formátu je ve výchozím nastavení zakázán kvůli zpětné kompatibilitě. Automatický výběr formátu lze povolit prostřednictvím kódu programu nebo prostřednictvím konfigurace. Následující příklad ukazuje, jak povolit automatický výběr formátu v kódu.

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

Automatické formátování je také možné povolit prostřednictvím konfigurace. Vlastnost můžete nastavit AutomaticFormatSelectionEnabled přímo na objektu WebHttpBehavior nebo pomocí objektu WebHttpEndpoint. Následující příklad ukazuje, jak povolit automatický formát výběru na .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>  

Následující příklad ukazuje, jak povolit automatický výběr formátu pomocí 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>  

Explicitní formátování

Jak už název napovídá, v explicitním formátování vývojář určuje nejlepší formát, který se má použít v rámci kódu operace. Pokud je nejlepší formát XML nebo JSON, vývojář nastaví Format buď Xml nebo Json. Format Pokud vlastnost není explicitně nastavená, použije se výchozí formát operace.

Následující příklad zkontroluje parametr řetězce dotazu formátu pro formát, který se má použít. Pokud byl zadán, nastaví formát operace pomocí 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;  
    }  

Pokud potřebujete podporovat jiné formáty než XML nebo JSON, definujte operaci tak, aby měla návratový Messagetyp . V kódu operace určete odpovídající formát, který se má použít, a pak vytvořte Message objekt pomocí jedné z následujících metod:

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Každá z těchto metod přebírá obsah a vytváří zprávu s odpovídajícím formátem. Metodu WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements lze použít k získání seznamu formátů upřednostňovaných klientem v pořadí od snížení preference. Následující příklad ukazuje, jak použít WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements k určení formátu, který se má použít, a pak použije příslušnou metodu vytvoření odpovědi k vytvoření zprávy odpovědi.

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

Viz také