Udostępnij za pośrednictwem


Nieopakowane komunikaty

Przykład Unwrapped demonstruje niezapisane komunikaty. Domyślnie treść komunikatu jest formatowana tak, aby parametry operacji usługi zostały opakowane. Poniższy przykład przedstawia Add komunikat żądania do ICalculator usługi 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 n1 parametry i n2 . Z kolei w poniższym przykładzie pokazano odpowiedni komunikat w trybie niezapisanym.

<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 niezapisany nie opakowuje n1 parametrów i n2 w elemecie zawierającym, są bezpośrednimi elementami podrzędnych elementu treści soap.

Uwaga

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

W tym przykładzie jest tworzony niezapisany komunikat, stosując MessageContractAttribute parametr do typu parametru operacji usługi i zwracany typ 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 uprawnienia do zapisu usługi sieciowej dla tego katalogu.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej 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 temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

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