Freigeben über


WCF-Web-HTTP-Formatierung

Mit dem WCF-Web-HTTP-Programmiermodell können Sie dynamisch das beste Format für einen Dienstvorgang ermitteln, in dem die Antwort zurückgegeben wird. Es werden zwei Methoden zum Ermitteln eines geeigneten Formats unterstützt: automatisch und explizit.

Automatische Formatierung

Wenn diese Option aktiviert ist, wählt die automatische Formatierung das beste Format aus, in dem die Antwort zurückgegeben werden soll. Es bestimmt das beste Format, indem Folgendes überprüft wird, in der folgenden Reihenfolge:

  1. Medientypen im Accept-Header der Anforderungsnachricht

  2. Der Inhaltstyp der Anforderungsnachricht.

  3. Die Standardformateinstellung im Vorgang.

  4. Die Standardformateinstellung im WebHttpBehavior.

Wenn die Anforderungsnachricht einen Accept-Header enthält, sucht die Windows Communication Foundation (WCF)-Infrastruktur nach einem unterstützten Typ. Wenn der Accept Header Prioritäten für seine Medientypen angibt, werden sie berücksichtigt. Wenn im Header kein geeignetes Format gefunden Accept wird, wird der Inhaltstyp der Anforderungsnachricht verwendet. Wenn kein geeigneter Inhaltstyp angegeben ist, wird die Standardformateinstellung für den Vorgang verwendet. Das Standardformat wird mit dem ResponseFormat-Parameter der WebGetAttribute- und WebInvokeAttribute-Attribute festgelegt. Wenn für den Vorgang kein Standardformat angegeben ist, wird der Wert der DefaultOutgoingResponseFormat Eigenschaft verwendet. Die automatische Formatierung basiert auf der AutomaticFormatSelectionEnabled Eigenschaft. Wenn diese Eigenschaft auf true festgelegt ist, bestimmt die WCF-Infrastruktur das beste zu verwendende Format. Die automatische Formatauswahl ist standardmäßig aus Gründen der Abwärtskompatibilität deaktiviert. Die automatische Formatauswahl kann programmgesteuert oder über die Konfiguration aktiviert werden. Das folgende Beispiel zeigt, wie die automatische Formatauswahl im Code aktiviert wird.

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

Die automatische Formatierung kann auch über die Konfiguration aktiviert werden. Sie können die AutomaticFormatSelectionEnabled-Eigenschaft direkt auf WebHttpBehavior oder durch die Verwendung von WebHttpEndpoint festlegen. Das folgende Beispiel zeigt, wie Sie die automatische Formatauswahl auf dem WebHttpBehavior aktivieren.

<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>  

Das folgende Beispiel zeigt, wie Sie die automatische Formatauswahl mithilfe von WebHttpEndpoint aktivieren können.

<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>  

Explizite Formatierung

Wie der Name schon sagt, bestimmt der Entwickler in expliziter Formatierung das beste Format, das im Vorgangscode verwendet werden soll. Wenn das beste Format XML oder JSON ist, legt der Entwickler Format entweder auf Xml oder Json fest. Wenn die Format Eigenschaft nicht explizit festgelegt ist, wird das Standardformat des Vorgangs verwendet.

Im folgenden Beispiel wird der Format-Abfragezeichenfolgenparameter überprüft, um ein zu verwendendes Format zu finden. Wenn es angegeben ist, wird das Format des Vorgangs mithilfe von Format festgelegt.

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

Wenn Sie andere Formate als XML oder JSON unterstützen müssen, definieren Sie Ihren Vorgang mit einem Rückgabetyp von Message. Ermitteln Sie im Vorgangscode das geeignete Format, das sie verwenden soll, und erstellen Sie dann ein Message Objekt mit einer der folgenden Methoden:

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Jede dieser Methoden verwendet Inhalte und erstellt eine Nachricht mit dem entsprechenden Format. Die WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements Methode kann verwendet werden, um eine Liste der Formate abzurufen, die vom Client in absteigender Präferenz bevorzugt werden. Das folgende Beispiel zeigt, wie Sie mit WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements das zu verwendende Format bestimmen und dann mit der entsprechenden Erstellungsantwortmethode die Antwortnachricht erstellen.

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

Siehe auch