Delen via


WCF-web-HTTP-opmaak

Met het WCF-web-HTTP-programmeermodel kunt u dynamisch bepalen in welke indeling een servicebewerking het antwoord moet retourneren. Er worden twee methoden ondersteund voor het bepalen van een geschikte indeling: automatisch en expliciet.

Automatische opmaak

Wanneer deze optie is ingeschakeld, kiest automatische opmaak de beste indeling waarin het antwoord moet worden geretourneerd. Het bepaalt de beste indeling door het volgende te controleren, in volgorde:

  1. De mediatypen in de header Accepteren van het aanvraagbericht.

  2. Het inhoudstype van het aanvraagbericht.

  3. De standaardindelingsinstelling in de bewerking.

  4. De standaardindelingsinstelling in de WebHttpBehavior.

Als het aanvraagbericht een Accept-header bevat, zoekt de WCF-infrastructuur (Windows Communication Foundation) naar een type dat wordt ondersteund. Als de Accept header prioriteiten voor de mediatypen specificeert, worden deze gehonoreerd. Als er geen geschikte indeling wordt gevonden in de Accept koptekst, wordt het inhoudstype van het aanvraagbericht gebruikt. Als er geen geschikt inhoudstype is opgegeven, wordt de standaardindelingsinstelling voor de bewerking gebruikt. De standaardindeling wordt ingesteld met de ResponseFormat parameter van de WebGetAttribute en WebInvokeAttribute kenmerken. Als er geen standaardindeling is opgegeven voor de bewerking, wordt de waarde van de DefaultOutgoingResponseFormat eigenschap gebruikt. Automatische opmaak is afhankelijk van de AutomaticFormatSelectionEnabled eigenschap. Wanneer deze eigenschap is ingesteld op true, bepaalt de WCF-infrastructuur de beste indeling die moet worden gebruikt. Automatische opmaakselectie is standaard uitgeschakeld voor compatibiliteit met eerdere versies. Automatische opmaakselectie kan programmatisch of via configuratie worden ingeschakeld. In het volgende voorbeeld ziet u hoe u automatische opmaakselectie inschakelt in code.

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

Automatische opmaak kan ook worden ingeschakeld via configuratie. U kunt de AutomaticFormatSelectionEnabled eigenschap rechtstreeks op de WebHttpBehavior of met behulp van de WebHttpEndpointeigenschap instellen. In het volgende voorbeeld ziet u hoe u de automatische opmaakselectie kunt inschakelen op de 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>  

In het volgende voorbeeld ziet u hoe u automatische opmaakselectie inschakelt met behulp van 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>  

Expliciete opmaak

Zoals de naam al aangeeft, bepaalt de ontwikkelaar bij expliciete opmaak de beste indeling die in de bewerkingscode moet worden gebruikt. Als de beste indeling XML of JSON is, wordt door de ontwikkelaar ingesteld Format op of XmlJson. Als de Format eigenschap niet expliciet is ingesteld, wordt de standaardindeling van de bewerking gebruikt.

In het volgende voorbeeld wordt de querytekenreeksparameter format gecontroleerd voor een indeling die moet worden gebruikt. Als deze is opgegeven, wordt de indeling van de bewerking ingesteld met behulp van 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;  
    }  

Als u andere indelingen dan XML of JSON wilt ondersteunen, definieert u de bewerking om een retourtype te Messagehebben. Bepaal in de bewerkingscode de juiste indeling die moet worden gebruikt en maak vervolgens een Message object met behulp van een van de volgende methoden:

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Elk van deze methoden gebruikt inhoud en maakt een bericht met de juiste indeling. De WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements methode kan worden gebruikt om een lijst met indelingen op te halen die door de client worden aanbevolen in volgorde van afnemende voorkeur. In het volgende voorbeeld ziet u hoe WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements u de indeling kunt bepalen die moet worden gebruikt en vervolgens de juiste methode voor het maken van een antwoord gebruikt om het antwoordbericht te maken.

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

Zie ook