Вызов веб-сервиса, который использует кодирование ISO-8859-1 от WCF

Я пытаюсь назвать веб-сервис с помощью WCF, который использует следующее кодирование:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

Я не могу изменить кодирование для этого веб-сервиса. Я генерировал прокси wcf и когда я пытаюсь назвать прокси, я получаю следующую ошибку:

FailedSystem. ServiceModel. ProtocolException: тип контента text/xml; charset=ISO-8859-1 ответного сообщения не соответствует типу контента привязки (text/xml; charset=utf-8). При использовании пользовательского кодера, уверены, что метод IsContentTypeSupported реализован правильно.

У кого-либо есть какая-либо идея, как я называю веб-сервис, который не является UTF-8, использующим wcf?

27
задан meagar 22 May 2012 в 14:26
поделиться

1 ответ

К сожалению, вы не можете сделать это из коробки в WCF.

Я столкнулся с той же проблемой и придумал настраиваемую привязку (либо в конфигурации или в коде), который вы можете использовать. Он основан на HTTP-транспорте, и если это вам поможет, я могу опубликовать здесь настраиваемую конфигурацию или отправить вам ссылку на код C # для привязки.

Эта страница MSDN здесь показывает, как создать «CustomTextEncoder», который может поддерживать кодировки более чем utf-8, utf-16 и unicode. Он включает в себя полный пример исходного кода и был очень полезен для меня, чтобы начать работу.

Эта запись в блоге здесь показывает некоторые дополнительные моменты, которые следует учитывать при попытке заставить этот пользовательский кодировщик текста работать должным образом.

Надеюсь, что это поможет.

Марк

ОБНОВЛЕНИЕ:
На основе упомянутого выше примера Microsoft для CustomTextEncoder вы можете легко создать настраиваемую привязку с кодировкой текстового сообщения ISO-8859-1 - просто используйте этот фрагмент конфигурации (при условии, что вы загрузили, скомпилировали и ссылались на этот образец Microsoft ):

  <system.serviceModel>
    <extensions>
      <bindingElementExtensions>
        <add name="customTextMessageEncoding"
             type="Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement, 
                   Microsoft.ServiceModel.Samples.CustomTextEncoder"/>
      </bindingElementExtensions>
    </extensions>
    <bindings>
      <customBinding>
        <binding name="ISO8859Binding" >
          <customTextMessageEncoding encoding="ISO-8859-1" />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>

    <client>
      <endpoint name="Test"
                address="......."
                binding="customBinding"
                bindingConfiguration="ISO8859Binding" 
                contract="IYourContract" />
    </client>
  </system.serviceModel>

Вы можете найти этот код, а также привязку ISO88591Binding , которая в основном превращает всю эту конфигурацию в код в моем каталоге Skydrive Кодировка WCF ISO 8859-1 . Однако будьте осторожны - это основано на моих требованиях, которые у меня были в то время, например, мой сервис, который мне нужно было поговорить с требуемым https, а также некоторые другие немного странные настройки, так что вам может потребоваться настроить их или сделать их настраиваемыми в конфигурации, если это необходимо. Этот проект ISO88591Binding также содержит netHttpBinding, который снова является образцом, предоставленным Microsoft, который я использовал, чтобы научиться писать свою собственную привязку в коде.

Написание настраиваемой привязки в WCF определенно возможно, но не совсем для слабонервный ....

24
ответ дан 28 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: