Исключение Silverlight + WCF: Ожидание приложения/мыла + xml, полученный текст/xml
У меня есть приложение Silverlight, в котором я бы хотел вызвать службу WCF. При вызове службы я получаю следующий ответ от сервера:
415 Не удается обработать сообщение, потому что тип содержимого "text/xml; charset = utf-8 'не был ожидаемым типом' application/soap + xml; кодировка = UTF-8
Кто-нибудь испытал эту проблему раньше? Кто-нибудь знает, какие настройки конфигурации мне нужно настроить? Любая информация о том, как исправить это, будет оценена.
Ответы
Ответ 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.
Надеюсь, что это поможет.