Udostępnij przez


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.