2009-03-17 26 views
10

Me cuesta mucho conseguir ese momento "mágico" cuando WCF está configurado muy bien y jQuery estructura sus solicitudes/respuestas de comprensión muy bien.JQuery/WCF sin ASP.NET AJAX:

que tienen un servicio:

<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %> 

Este fue recomendado por el hombre Rick Strahl para evitar tener que definir los comportamientos dentro Web.config.

Mi interfaz para el servicio WCF se sienta en otro montaje:

namespace xxx.yyy.WCF.Data 
{  
    [ServiceContract(Namespace = "yyyWCF")] 
    public interface IClientBroker 
    { 
     [OperationContract]   
     [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)] 
     IClient GetClientJson(int clientId);  
    } 
} 

La clase de servicio concreto es:

namespace xxx.yyy.WCF.Data 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    class ClientBroker : IClientBroker 
    { 
     public IClient GetClientJson(int clientId) 
     { 
      IClient client=new Client(); 

      // gets and returns an IClient 
      return client; 
     } 
    } 
} 

Mi iClient es una clase Entity Framework así está decorado con atributos/DataMember DataContract adecuadamente.

Estoy tratando de llamar a mi servicio WCF utilizando los métodos descritos en el blog de Rick Strahl al http://www.west-wind.com/weblog/posts/324917.aspx (la versión "full fat"). El depurador salta a la multa del servicio WCF (para que se entienda mi jQuery/JSON) y obtiene el IClient y lo devuelve. Sin embargo, cuando devuelvo la respuesta, obtengo varios errores inútiles. Los errores que estoy recibiendo no significan mucho.

Estoy usando POST.

¿Es correcto utilizar una interfaz en lugar de un objeto concreto? A medida que ingresa al servicio WCF, parece ser la codificación del resultado que está fallando.

¿Alguien tiene alguna idea?

Respuesta

10

A primera vista hay tres problemas con su código:

1: se debe utilizar el ServiceKnownTypeAttribute para especificar los tipos conocidos al exponer sólo los tipos de bases en sus contratos de operación:

[ServiceContract(Namespace = "yyyWCF")]  
public interface IClientBroker 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(Client))] 
    [WebInvoke(
     Method="GET", 
     BodyStyle=WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat=WebMessageFormat.Json)] 
    IClient GetClientJson(int clientId); 

} 

2: Debería usar WebMessageBodyStyle.WrappedRequest en lugar de WebMessageBodyStyle.Wrapped porque este último no es compatible con WebScriptServiceHostFactory.

3: Uso mi humilde opinión Método = "GET" sería más relajante para un método llamado GetClientJson de method = "post"

Otro consejo que podría darle al trabajar con servicios WCF es utilizar SvcTraceViewer.exe incluido con Visual Estudio. Es una gran herramienta para depuración. Todo lo que necesita es añadir la siguiente sección para su aplicación/web.config:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="sdt" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "WcfDetailTrace.e2e" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

continuación, se invoca el método web y archivos WcfDetailTrace.e2e se generarán en el directorio raíz del sitio web. Luego abra este archivo con SvcTraceViewer.exe y verá mucha información útil.Por ejemplo, podría decir:

No se puede serializar parámetro de tipo 'MyNamespace.Client' (para el funcionamiento 'GetClientJson', contrato 'IClientBroker'), ya que no es el 'MyNamespace.IClient' tipo exacto en la firma del método y no está en la colección de tipos conocidos . Para serializar el parámetro, agregue el tipo a la colección de tipos conocidos para la operación utilizando ServiceKnownTypeAttribute.

Por supuesto, no debe olvidar comentar esta sección antes de entrar en producción o puede terminar con algunos archivos bastante grandes.

+0

Gracias Darin, Resulta que mi problema es con JSON serialización de objetos Entity Framework (blogged: http://tinyurl.com/cc4k37). Pero su consejo sobre SvcTraceViewer fue invaluable al recordarme esta gran herramienta y también detectar la excepción. Además: acordó REST para algunos métodos, ¡pero no este 1! –

2

Estoy 99% seguro de que no puede devolver una interfaz. No creo que las interfaces sean serializables.

la salida de este thread

+0

Gracias Mike, de hecho tienes razón. Tanto para mi agradable API basada en interfaz, ¿eh? Ha degradado mi interfaz WCF a cadenas JSON, llevando la serialización "en casa". –