Вызов веб-службы, использующей кодировку ISO-8859-1 из WCF - PullRequest
27 голосов
/ 15 декабря 2009

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

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 15 декабря 2009

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

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

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

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

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

Марк

UPDATE:
Основываясь на примере 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 Кодировка ISO 8859-1 WCF . Остерегайтесь, хотя - это основано на моих требованиях, которые у меня были в то время, например. Мой сервис Мне нужно было поговорить с требуемыми https, а также с некоторыми другими немного странными настройками, поэтому вам может понадобиться настроить их или настроить в config, если это необходимо. Этот проект ISO88591Binding также содержит netHttpBinding, который также является примером, предоставленным Microsoft, который я использовал, чтобы научиться писать свое собственное пользовательское связывание в коде.

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

8 голосов
/ 02 февраля 2016

Другой вариант - использование устаревшей технологии .NET Framework 2.0 ASMX WebServices, которая поддерживает iso-8859-1 из коробки:

enter image description here

enter image description here

И если служба использует обычную HTTP-аутентификацию, вы можете указать ее следующим образом:

TheService theService = new TheService();
theService.Credentials = new NetworkCredential("username", "password");
7 голосов
/ 10 июня 2014

В этой ссылке вы можете скачать файлы для создания пользовательского связывания и выполнить в коде следующее:

CustomBinding binding = new CustomBinding(
   new CustomTextMessageBindingElement("iso-8859-1", "text/xml", MessageVersion.Soap11),
   new HttpTransportBindingElement());

myWebService client = new myWebService();

client.Endpoint.Binding = binding;
2 голосов
/ 09 октября 2013

Если вы не хотите иметь дело с тоннами загруженных кодов и низкоуровневой реализацией, вы можете обойти это, используя запрос старого стиля с использованием класса HttpWebRequest, как описано здесь . Теперь вы освобождаетесь от автоматизированного кода и возможностей интерфейса и поиграете с ручным синтаксическим анализом XML.

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