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
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
Utwórz katalog C:\LOGS na potrzeby rejestrowania komunikatów. Nadaj użytkownikowi uprawnienia do zapisu usługi sieciowej dla tego katalogu.
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).
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.