2009-01-29 11 views
12

Tengo una aplicación Silverlight en la que me gustaría llamar a un servicio WCF. Al llamar al servicio, recibo la siguiente respuesta del servidor:Silverlight + WCF excepción: Esperando aplicación/soap + xml, recibido texto/xml

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 tenido este problema antes? ¿Alguien sabe qué ajustes de configuración necesito ajustar? Cualquier información sobre cómo solucionar esto sería apreciada.

Respuesta

9

Bueno, podría intentar usar la plantilla "Servicio WCF habilitado para Silverlight" en VS2008 y comparar las diferencias? Espero que necesite usar el basicHttpBinding y esté usando algo más exótico.

Para información, aquí es la sección de web.config para un servicio de Silverlight/WCF por defecto:

<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> 
+0

Gracias por la información ... resulta que uno de los servicios se configuró en el servidor para wsHttpBinding. – Kevin

2

Probablemente el servicio está lanzando 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 llamado 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 un par de formas de examinar la excepción: mirar el mensaje de excepción en detalle o seguir las llamadas al servicio WCF.

  1. Para ver el mensaje de excepción ponga un try-catch alrededor de la llamada de servicio y establezca 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 en include exception details in the fault message.

  2. Puede rastrear fácilmente los mensajes de WCF habilitando el registro de mensajes para el servicio. Puede hacerlo en el archivo de configuración (consulte Configuring Message Logging) o utilizando el Editor de configuración de servicio 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".

+0

Gracias por la información Tom, resulta que uno de mis servicios se configuró como wsHttpBinding. Bonito escrito a través de – Kevin

2

Puede cambiar el tipo de contenido de la respuesta en cualquier método de su servicio web WCF utilizando el WebOperationContext class.

Sólo como ejemplo el siguiente código muestra cómo utilizar esta clase para establecer el tipo de contenido application/xml y devolver una secuencia codificación 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 le interesa este ejemplo es con el propósito de habilitar llamadas entre dominios para clientes de Silverlight en un servicio web WCF autohospedado, eche un vistazo a here para obtener más información y tengo un código de descarga attached to this post.

En su situación, para la respuesta de su servicio WCF debería configurar el tipo de contenido como application/soap + xml y usar UTF-8.

La clase WebOperationContext está en el ensamblado System.ServiceModel.Web y es parte de .NET Framework 3.5.

Espero que esto ayude.

+0

Gracias Peter ... tu nota es en realidad un excelente bocado de conocimiento para archivar. Mi problema fue configurar incorrectamente en el servidor como wsHttpBinding. – Kevin

3

Encontré este error al intentar conectar una aplicación Silverlight a un servicio WCF.

La causa principal resultó ser que el servicio WCF se enlazó utilizando wsHttpBinding, mientras que Silverlight solo es compatible con basicHttpBinding.

a fin de comprobar su elemento <bindings> en web.config y crea información de enlace seguro para su servicio está en el elemento <basicHttpBinding> y que el elemento <endpoint> de la definición de servicio utiliza basicHttpBinding.

Cuestiones relacionadas