Ну, я полагаю, я нашел причину такого поведения.
Прежде всего, я реализовал IDispatchMessageInspector
.Это дало мне возможность отслеживать запросы от клиента.Запросы от клиента выглядят так:
+ request {<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost/</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IHttpsServer/Post</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Post xmlns="http://tempuri.org/">
<xml flag="true">
<Name>John</Name>
</xml>
</Post>
</s:Body>
</s:Envelope>} System.ServiceModel.Channels.Message {System.ServiceModel.Channels.BufferedMessage}
Через некоторое время я заметил, что для узла Post
определено пространство имен по умолчанию, а для узла 'xml' не определено пространство имен.Итак, у нас есть то, что xml
в этом примере является частью xmlns="http://tempuri.org/"
, а не пустым пространством имен, как оно определено.
Чтобы проверить мое предложение, я сгенерировал код клиента и вручную добавил XmlType
атрибут к объявлению SomeEvent
:
[System.Xml.Serialization.XmlType(Namespace = "")]
После этого изменения я получил следующий запрос:
+ request {<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost/</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IHttpsServer/Post</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Post xmlns="http://tempuri.org/">
<xml flag="true">
<Name xmlns="">John</Name>
</xml>
</Post>
</s:Body>
</s:Envelope>} System.ServiceModel.Channels.Message {System.ServiceModel.Channels.BufferedMessage}
(есть определение пространства имен по умолчанию с помощьюузел Name
).
И после этого мой сервис работает нормально.
Мое предложение по причине проблемы :
На случай, есликогда я определил пустое пространство имен для события [XmlType(Namespace = "")]public class SomeEvent {...}
, атрибут XmlType
будет пропущен при генерации клиентского кода.И это помещает, когда запрос будет отправлен, XML, описывающий событие, помещается в пространство имен ServiceContract
.После этого WCF не может десериализовать событие.
Таким образом, есть два решения проблемы :
- Избегайте использования события с пустым пространством имен (см.сценарий использования 2).
- Добавить частичный класс для события
[XmlType(Namespace = "")]public partial class SomeEvent {}