Niezapisane komunikaty

Przykład nieopakowanych komunikatów demonstruje komunikaty bez opakowania. Domyślnie treść komunikatu jest formatowana tak, aby parametry operacji usługi zostały opakowane. Poniższy przykład przedstawia komunikat żądania Add do usługi ICalculator w trybie opakowanym.

<s:Envelope
    xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://schemas.xmlsoap.org/ws/2005/08/addressing">
    <s:Header>
        …
    </s:Header>
    <s:Body>
      <Add xmlns="http://Microsoft.ServiceModel.Samples">
        <n1>100</n1>
        <n2>15.99</n2>
      </Add>
    </s:Body>
</s:Envelope>

Element <Add> w treści komunikatu opakowuje parametry n1 i n2. Z kolei w poniższym przykładzie pokazano równoważny komunikat w trybie bez zawijania.

<s:Envelope
    xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://schemas.xmlsoap.org/ws/2005/08/addressing">
    <s:Header>
        ….
    </s:Header>
    <s:Body>
      <n1 xmlns="http://Microsoft.ServiceModel.Samples">100</n1>
      <n2 xmlns="http://Microsoft.ServiceModel.Samples">15.99</n2>
    </s:Body>
  </s:Envelope>

Komunikat nieopakowany nie opakowuje parametrów n1 i n2 w elemencie zawierającym, są bezpośrednimi elementami podrzędnymi elementu ciała SOAP.

Uwaga / Notatka

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

W tym przykładzie jest tworzony rozpakowany komunikat, stosując MessageContractAttribute do typu parametru operacji usługi oraz typu zwracanej wartości, jak pokazano w poniższym przykładowym kodzie.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    ResponseMessage Add(RequestMessage request);
    [OperationContract]
    ResponseMessage Subtract(RequestMessage request);
    [OperationContract]
    ResponseMessage Multiply(RequestMessage request);
    [OperationContract]
    ResponseMessage Divide(RequestMessage request);
}

//setting IsWrapped to false means the n1 and n2
//members will be direct children of the soap body element
[MessageContract(IsWrapped = false)]
public class RequestMessage
{
    [MessageBodyMember]
    private double n1;
    [MessageBodyMember]
    private double n2;
    //…
}

//setting IsWrapped to false means the result
//member will be a direct child of the soap body element
[MessageContract(IsWrapped = false)]
public class ResponseMessage
{
    [MessageBodyMember]
    private double result;
    //…
}

Aby umożliwić wyświetlanie wysyłanych i odbieranych komunikatów, w tym przykładzie użyto śledzenia. Ponadto WSHttpBinding element został skonfigurowany bez zabezpieczeń, aby zmniejszyć liczbę komunikatów, które rejestruje.

Wynikowy dziennik śledzenia (c:\logs\Message.log) można wyświetlić za pomocą narzędzia Podgląd śledzenia usługi (SvcTraceViewer.exe). Aby wyświetlić zawartość wiadomości, wybierz pozycję Komunikaty w okienkach po lewej i prawej stronie narzędzia Podgląd śledzenia usługi. Dzienniki śledzenia w tym przykładzie są konfigurowane do generowania w folderze C:\LOGS. Utwórz ten folder przed uruchomieniem przykładu i nadaj użytkownikowi Network Service uprawnienia do zapisu dla tego katalogu.

Aby skonfigurować, skompilować i uruchomić przykładowy program

  1. Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.

  2. Utwórz katalog C:\LOGS na potrzeby rejestrowania komunikatów. Nadaj użytkownikowi uprawnienia do zapisu usługi sieciowej dla tego katalogu.

  3. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów Windows Communication Foundation.

  4. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.