Сообщения без оболочки
В примере unwrapped демонстрируется распакученное сообщение. По умолчанию текст сообщения форматируется так, чтобы параметры, которые передаются операциям службы, находились в оболочке. В следующем образце показано заключенное в оболочку сообщение запроса Add
для службы ICalculator
.
<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>
Элемент <Add>
в теле сообщения выступает в роли оболочки для параметров n1
и n2
. В следующем образце показано эквивалентное сообщение без оболочки.
<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>
В этом сообщении параметры n1
и n2
не помещены в элемент-оболочку, а являются непосредственными дочерними элементами элемента soap body.
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
В этом образце сообщение без оболочки создается путем применения атрибута MessageContractAttribute к типу параметра и типу возвращаемого значения операции службы, как показано в следующем образце кода.
[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;
//…
}
Для просмотра всех отправляемых и получаемых сообщений в этом образце используется трассировка. Кроме того, для привязки WSHttpBinding не были настроены параметры безопасности, чтобы сократить число заносимых в журнал сообщений.
Результирующий журнал трассировки (c:\logs\Message.log) можно просмотреть с помощью средства просмотра трассировки служб (SvcTraceViewer.exe). Чтобы просмотреть содержимое сообщения, выберите "Сообщения " в левой и правой области средства "Средство просмотра трассировки службы". Этот образец настроен таким образом, чтобы журналы трассировки сохранялись в папке C:\LOGS. Создайте эту папку перед выполнением образца и предоставьте сетевой службе пользователя разрешение на запись в эту папку.
Настройка, сборка и выполнение образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Создайте каталог C:\LOGS для регистрации сообщений. Предоставьте сетевой службе пользователя разрешение на запись в этот каталог.
Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".