Partager via


Mise en forme HTTP web WCF

Le modèle de programmation Web HTTP WCF vous permet de déterminer dynamiquement le meilleur format pour qu'une opération de service retourne sa réponse. Deux méthodes pour déterminer un format approprié sont prises en charge : automatique et explicite.

Mise en forme automatique

Lorsque cette option est activée, la mise en forme automatique choisit le meilleur format dans lequel retourner la réponse. Il détermine le meilleur format en vérifiant les éléments suivants, dans l’ordre :

  1. Types de médias dans l'en-tête Accept du message de demande.

  2. Type de contenu du message de requête.

  3. Paramètre de format par défaut dans l’opération.

  4. Paramètre de format par défaut dans WebHttpBehavior.

Si le message de demande contient un en-tête Accept, l’infrastructure Windows Communication Foundation (WCF) recherche un type qu’il prend en charge. Si l’en-tête Accept spécifie des priorités pour ses types de média, celles-ci sont respectées. Si aucun format approprié n’est trouvé dans l’en-tête Accept , le type de contenu du message de requête est utilisé. Si aucun type de contenu approprié n’est spécifié, le paramètre de format par défaut de l’opération est utilisé. Le format par défaut est défini avec le paramètre ResponseFormat des attributs WebGetAttribute et WebInvokeAttribute. Si aucun format par défaut n’est spécifié sur l’opération, la valeur de la DefaultOutgoingResponseFormat propriété est utilisée. La mise en forme automatique s’appuie sur la AutomaticFormatSelectionEnabled propriété. Lorsque cette propriété est réglée à true, l'infrastructure WCF détermine le meilleur format à utiliser. La sélection automatique du format est désactivée par défaut pour la compatibilité descendante. La sélection de format automatique peut être activée par programmation ou par le biais de la configuration. L’exemple suivant montre comment activer la sélection automatique de format dans le 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());  
  }  

La mise en forme automatique peut également être activée via la configuration. Vous pouvez définir la AutomaticFormatSelectionEnabled propriété directement sur le WebHttpBehavior ou à l’aide du WebHttpEndpoint. L’exemple suivant montre comment activer la sélection de format automatique sur le 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>  

L’exemple suivant montre comment activer la sélection de format automatique à l’aide WebHttpEndpointde .

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

Mise en forme explicite

Comme le nom l’indique, dans la mise en forme explicite, le développeur détermine le meilleur format à utiliser dans le code d’opération. Si le meilleur format est XML ou JSON, le développeur définit Format sur Xml ou Json. Si la Format propriété n’est pas définie explicitement, le format par défaut de l’opération est utilisé.

L’exemple suivant vérifie le paramètre de chaîne de requête pour déterminer le format à utiliser. Si elle a été spécifiée, elle définit le format de l’opération à l’aide de 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 vous devez prendre en charge des formats autres que XML ou JSON, définissez votre opération avec un type de retour de Message. Dans le code d’opération, déterminez le format approprié à utiliser, puis créez un Message objet à l’aide de l’une des méthodes suivantes :

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Chacune de ces méthodes prend du contenu et crée un message au format approprié. La WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements méthode peut être utilisée pour obtenir une liste de formats préférés par le client dans l’ordre de préférence décroissante. L’exemple suivant montre comment l’utiliser WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements pour déterminer le format à utiliser, puis utilise la méthode de création de réponse appropriée pour créer le message de réponse.

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

Voir aussi