Подтвердить что ты не робот

Вызов веб-службы, которая использует кодировку 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; кодировка = UTF-8). Если вы используете кодер, убедитесь, что Метод IsContentTypeSupported правильно реализованы.

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

4b9b3361

Ответ 1

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

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

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

Написание пользовательской привязки в WCF определенно возможно - но не для слабого сердца....

Ответ 2

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

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

myWebService client = new myWebService();

client.Endpoint.Binding = binding;

Ответ 3

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

введите описание изображения здесь

введите описание изображения здесь

И если служба использует Basic HTTP Authentication, вы можете указать ее следующим образом:

TheService theService = new TheService();
theService.Credentials = new NetworkCredential("username", "password");

Ответ 4

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