Клиент WCF не включает объявление XML в сообщение HTTP POST
Этот пост посвящен последнему препятствию в выполнении моей задачи по связи с маршрутизатором Cisco через агента управления веб-сервисами (WSMA), как описано здесь и здесь. Вам не нужно будет читать эти посты, чтобы понять мой текущий вопрос.
Проблема заключается в следующем: у меня есть контракты на создание сервисов и сообщений, соответствующие веб-сервисам маршрутизатора, и я настроил базовую HttpBinding и конечную точку. И используя фабрику каналов, я сейчас почти, но не совсем, успешно общаюсь с роутером.
Я продолжаю получать ошибку SOAP в ответ, заявляя, что "отсутствует ожидаемый тег или последовательность XML". Используя трассировку WCF, fiddler и отладку на маршрутизаторе, а также отправляя сообщения вручную по HTTP, я наконец выяснил, что происходит.
Агент WSMA на маршрутизаторе ожидает, что полезная нагрузка сообщения SOAP в запросе HTTP будет включать декларацию XML. И WCF не отправляет. Так просто.
Итак, мой вопрос: как я могу сделать так, чтобы WCF, используя basicHttpBinding, включал в сообщение декларацию XML?
Для справки, моя конфигурация привязки выглядит так:
<basicHttpBinding>
<binding name="BasicHttpBinding_IWsmaService" messageEncoding="Text" textEncoding="UTF-8" allowCookies="false">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" proxyCredentialType="None" realm="level_15" />
</security>
</binding>
</basicHttpBinding>
(если вам интересно - да, я в курсе, что отправляю незашифрованные учетные данные через незашифрованный транспорт)
1 ответ
Вам нужно будет создать собственный кодировщик. Проверьте образцы WCF. Приведенный пример показывает, как создать новый кодер с композицией существующего. Вы будете использовать TextMessageEncodingBindingElement для создания внутреннего MessageEncoder. Ваша реализация WriteMessage напишет декларацию XML и затем вызовет внутренний кодировщик, чтобы написать сериализованное сообщение.
Вам также нужно будет обернуть новый кодировщик в пользовательский элемент привязки и использовать его в пользовательском привязывании вместе с HttpTransportBindingElement.