Клиент 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.

Другие вопросы по тегам