.net - explained - Excepción de Silverlight+WCF: aplicación de espera/soap+xml, text/xml recibido
wcf soap service web config (4)
Tengo una aplicación de Silverlight en la que me gustaría llamar a un servicio de WCF. Al llamar al servicio, recibo la siguiente respuesta del servidor:
415 No se puede procesar el mensaje porque el tipo de contenido ''text / xml; charset = utf-8 ''no era el tipo esperado'' application / soap + xml; charset = utf-8
Alguien ha experimentado este problema antes? ¿Alguien sabe qué ajustes de configuración necesito ajustar? Cualquier información sobre cómo solucionar esto sería apreciada.
Bueno, podría intentar usar la plantilla "Servicio WCF habilitado para Silverlight" en VS2008, y comparar las diferencias? Espero que necesites usar el basicHttpBinding
y estés usando algo más exótico.
Para obtener información, aquí está la sección web.config para un servicio Silverlight / WCF predeterminado:
<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>
Probablemente el servicio arroje una excepción. El mensaje de excepción no está en el formato esperado por la llamada de servicio, de ahí el mensaje "no el tipo esperado".
Si el método invocado no arroja una excepción internamente, verifique su configuración de seguridad para el servicio u otros elementos de configuración, según la útil respuesta de Marc Gravell.
Hay algunas maneras de examinar la excepción: ver el mensaje de excepción en detalle o seguir las llamadas al servicio WCF.
Para ver el mensaje de excepción poner un try-catch alrededor de la llamada de servicio y establecer un punto de interrupción en el bloque catch. Esto le permitirá examinar los contenidos de la excepción. Es posible que desee configurar el servicio temporalmente para incluir detalles de excepción en el mensaje de error .
Puede rastrear fácilmente los mensajes WCF habilitando el registro de mensajes para el servicio. Puede hacerlo en el archivo de configuración (consulte Configuración del registro de mensajes ) o utilizando el Editor de configuración de servicios de WCF (disponible en el menú Herramientas de VS 2008 o haciendo clic con el botón derecho en el archivo de configuración). A continuación, use el Visor de rastreo de servicios para explorar el archivo de registro. El visor es parte del SDK y se puede encontrar aquí:
"C:/Program Files/Microsoft SDKs/Windows/v6.0A/bin/SvcTraceViewer.exe"
.
Puede cambiar el tipo de contenido de la respuesta en cualquier método en su servicio web WCF utilizando la clase WebOperationContext .
Solo a modo de ejemplo, el siguiente código muestra cómo usar esta clase para establecer el tipo de contenido en application / xml y devolver una secuencia codificada en 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);
}
}
Si está interesado, este ejemplo es para permitir llamadas de dominio cruzado para clientes de Silverlight en un servicio web de WCF autohospedado, eche un vistazo aquí para obtener más información y tengo una descarga de código adjunta a esta publicación .
En su situación, para la respuesta de su servicio WCF, establecería el tipo de contenido como application / soap + xml y usaría UTF-8.
La clase WebOperationContext está en el ensamblado System.ServiceModel.Web y es parte de .NET Framework 3.5.
Espero que esto ayude.
Encontré este error al intentar conectar una aplicación Silverlight a un servicio WCF.
La causa raíz resultó ser que el servicio WCF estaba enlazado usando wsHttpBinding, mientras que Silverlight solo es compatible con basicHttpBinding.
Por lo tanto, verifique su elemento <bindings>
en web.config y asegúrese de que la información vinculante para su servicio esté en el elemento <basicHttpBinding>
y que el elemento <endpoint>
de su definición de servicio use basicHttpBinding.