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

Исключение Silverlight + WCF: Ожидание приложения/мыла + xml, полученный текст/xml

У меня есть приложение Silverlight, в котором я бы хотел вызвать службу WCF. При вызове службы я получаю следующий ответ от сервера:

415 Не удается обработать сообщение, потому что тип содержимого "text/xml; charset = utf-8 'не был ожидаемым типом' application/soap + xml; кодировка = UTF-8

Кто-нибудь испытал эту проблему раньше? Кто-нибудь знает, какие настройки конфигурации мне нужно настроить? Любая информация о том, как исправить это, будет оценена.

4b9b3361

Ответ 1

Ну, вы можете попробовать использовать шаблон Silverlight с поддержкой WCF в VS2008 и сравнить различия? Я ожидаю, что вам нужно использовать basicHttpBinding и использовать что-то более экзотическое.

Для информации, вот раздел web.config для службы Silverlight/WCF по умолчанию:

 <system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="MySite.Service1Behavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="MySite.Service1Behavior"
       name="MySite.Service1">
    <endpoint address="" binding="basicHttpBinding"
       contract="MySite.Service1" />
    <endpoint address="mex" binding="mexHttpBinding"
       contract="IMetadataExchange" />
   </service>
  </services>
 </system.serviceModel>

Ответ 2

Я столкнулся с этой ошибкой, пытаясь подключить приложение Silverlight к службе WCF.

Основная причина оказалась в том, что служба WCF была связана с использованием wsHttpBinding, тогда как Silverlight поддерживает только basicHttpBinding.

Итак, проверьте свой элемент <bindings> в файле web.config и убедитесь, что обязательная информация для вашей службы находится в элементе <basicHttpBinding> и что элемент <endpoint> вашего определения службы использует basicHttpBinding.

Ответ 3

Вероятно, служба выбрасывает исключение. Сообщение об исключении не в формате, ожидаемом вызовом службы, поэтому сообщение "не ожидаемый тип".

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

Существует несколько способов проверки исключения: подробное описание сообщения об исключении или отслеживание вызовов службы WCF.

  • Чтобы увидеть сообщение об исключении, поместите пробную попытку вокруг вызова службы и установите контрольную точку в блоке catch. Это позволит вам изучить содержимое исключения. Вы можете временно настроить службу на включить сведения об исключении в сообщение об ошибке.

  • Вы можете легко трассировать сообщения WCF, включив ведение журнала сообщений для службы. Вы можете сделать это в конфигурационном файле (см. Настройка ведения журнала сообщений) или с помощью редактора конфигурации службы WCF (доступного в меню VS 2008 Tools или щелкните правой кнопкой мыши файл конфигурации). Затем используйте средство просмотра трассировки служб для просмотра файла журнала. Зритель является частью SDK и может быть найден здесь: "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe".

Ответ 4

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

Как пример, следующий код показывает, как использовать этот класс для установки типа содержимого в application/xml и возврата потока с кодировкой UTF-8:

[ServiceContract]
public interface IPolicyProvider
{
    [OperationContract, WebGet(UriTemplate = "/ClientAccessPolicy.xml")]
    Stream ProvidePolicy();
}

public sealed class StockService : IPolicyProvider
{
    public Stream ProvidePolicy()
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
        return new MemoryStream( Encoding.UTF8.GetBytes(File.ReadAllText("ClientAccessPolicy.xml"))  , false);
    }
}

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

В вашей ситуации для ответа от вашей службы WCF вы должны установить тип контента как application/soap + xml и использовать UTF-8.

Класс WebOperationContext находится в сборке System.ServiceModel.Web и является частью .NET Framework 3.5.

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