Ten artykuł został przetłumaczony przez maszynę. Aby wyświetlić jego treść w języku angielskim, zaznacz pole wyboru Angielski. Możesz też wyświetlić angielski tekst w okienku wyskakującym, przesuwając wskaźnik myszy nad konkretny tekst”.
Tłumaczenie
Angielski

Formatowanie kodu HTTP dla sieci Web w programie WCF

.NET Framework (current version)
 

Model programowania protokołu HTTP sieci Web WCF można dynamicznie określić najlepsze formatu dla operacji usługi przywrócić jego odpowiedzi w. Obsługiwane są dwie metody, określając odpowiedni format: jawne i automatycznych.

Po włączeniu, automatycznego formatowania wybiera najlepsze format, w którym zwrócić odpowiedzi. Ustala najlepszy format, sprawdzając następujące polecenie, w kolejności:

  1. Typy nośników w nagłówku Accept komunikatu żądania.

  2. Typ zawartości komunikatu żądania.

  3. Domyślny format ustawienie w operacji.

  4. Domyślny format w WebHttpBehavior.

Jeśli komunikat żądania zawiera nagłówek Accept Windows Communication Foundation (WCF) infrastruktury wyszukuje typ, który obsługuje. Jeśli Accept nagłówka określa priorytety dla jego typów nośników, są one uznać. Jeśli nie odpowiedniego formatu znajduje się w Accept Nagłówek, typ komunikatu żądania zawartości jest używany. Jeśli zostanie określony żaden odpowiedni typ zawartości, jest używany domyślny format ustawienie dla tej operacji. Domyślny format jest określana za pomocą ResponseFormat parametru WebGetAttribute i WebInvokeAttribute atrybutów. Jeśli nie domyślny format jest określona w operacji, wartość DefaultOutgoingResponseFormat jest używana. Automatyczne formatowanie opiera się na AutomaticFormatSelectionEnabled Właściwości. Gdy ta właściwość ma wartość true, WCF infrastruktury Określa format używany. Automatyczne wybieranie formatu jest domyślnie wyłączona dla zapewnienia zgodności. Automatyczne wybieranie formatu można włączyć programowo lub przy użyciu konfiguracji. Poniższy przykład pokazuje, jak włączyć automatyczne wybieranie formatu w kodzie.

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


Automatyczne formatowanie można również włączyć przy użyciu konfiguracji. Można ustawić AutomaticFormatSelectionEnabled właściwości bezpośrednio na WebHttpBehavior lub przy użyciu WebHttpEndpoint. Poniższy przykład pokazuje, jak włączyć automatyczne wybieranie formatu w 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>

Poniższy przykład pokazuje, jak włączyć automatyczne formatowanie zaznaczenie przy użyciu 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>

Jak nazwa wskazuje, Deweloper w formatowaniu jawne określa najlepszy format do kodem operacji. Jeśli jest najlepszym formacie XML lub JSON Deweloper ustawia Format albo Xml lub Json. Jeśli Format nie jest jawnie określona właściwość, a następnie jest używany format domyślny wykonać operację.

Poniższy przykład sprawdza parametr ciągu kwerendy formatu dla formatu do użycia. Jeśli została określona, ustawia operacji formatowania przy użyciu 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;
    }

Jeśli trzeba obsługiwać formaty innych niż XML lub JSON, definiować operacji ma typ zwracany Message. Kodem operacji, należy określić odpowiedni format, a następnie utwórz Message przy użyciu jednej z następujących metod:

  • WebOperationContext.CreateAtom10Response

  • WebOperationContext.CreateJsonResponse

  • WebOperationContext.CreateStreamResponse

  • WebOperationContext.CreateTextResponse

  • WebOperationContext.CreateXmlResponse

Każda z tych metod przyjmuje zawartości i tworzy komunikat z odpowiednim formatem. WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements Metody można użyć w celu uzyskania listy formatów preferowany przez klienta w kolejności malejącej preferencji. Poniższy przykład przedstawia sposób użycia WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements do określenia formatu do użycia, a następnie używa odpowiednie Utwórz metodę odpowiedzi w celu utworzenia komunikatu odpowiedzi.


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

Pokaż: