2011-08-01 9 views
10

Con un contrato:WCF de jQuery como JSON

namespace ACME.FooServices 
{ 
    [ServiceContract] 
    public interface IFooService 
    { 
     [OperationContract] 
     [WebInvoke(Method = "POST", 
        ResponseFormat = WebMessageFormat.Json, 
        RequestFormat = WebMessageFormat.Json, 
        BodyStyle = WebMessageBodyStyle.Bare)]   
     FooMessageType Foo(string name); 
    } 

    [DataContract] 
    public class FooMessageType 
    { 
     string _name; 
     string _date; 

     [DataMember] 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     [DataMember] 
     public string Date 
     { 
      get { return _date; } 
      set { _date = value; } 
     } 
    } 
} 

e implementación:

using System; 
using System.ServiceModel.Activation; 

namespace ACME.FooServices 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
    public class FooService : IFooService 
    { 
     public FooMessageType Foo(string name) 
     { 
      string l_name = (String.IsNullOrWhiteSpace(name)) ? "Anonymous" : name; 

      return new FooMessageType {Name = l_name, Date = DateTime.Now.ToString("MM-dd-yyyy h:mm:ss tt")}; 
     } 
    } 
} 

configurado en el web.config como:

<system.serviceModel> 
    <services> 
     <service name="ACME.FooServices.FooService"> 
      <endpoint address="" behaviorConfiguration="ACME.FooBehaviour" binding="webHttpBinding" contract="ACME.FooServices.IFooService" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="ACME.FooBehaviour"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Estoy intentando llame a Foo desde una página a través de jQuery:

<script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 
     $("#msgButton").click(function() { 
      var params = {}; 
      params.name = $("#nameTextbox").val(); 

      $.ajax({ 
       type: 'POST', 
       url: "http://acme.com/wcfsvc/FooService.svc/Foo", 
       data: JSON.stringify(params), 
       contentType: 'application/json; charset=utf-8', 
       success: function (response, status, xhr) { alert('success: ' + response); }, 
       error: function (xhr, status, error) { alert("Error\n-----\n" + xhr.status + '\n' + xhr.responseText); }, 
       complete: function (jqXHR, status) { alert('Status: ' + status + '\njqXHR: ' + JSON.stringify(jqXHR)); } 
      }); 
     }); 
    });   
</script> 

Pero obtengo un error 400 - Solicitud incorrecta error con el mensaje "El servidor encontró un error al procesar la solicitud. El mensaje de excepción es 'Hubo un error deserializando el objeto de tipo System.String. End element 'root' del espacio de nombres '' esperado. Encontrado elemento 'nombre' del espacio de nombres".

Me estoy perdiendo algo?

Respuesta

15

Su params es objeto y que forma { "name" : "someValue" } cadena JSON. Si usted dice que estilo del cuerpo del mensaje es Bare Creo que su servicio espera algo como esto:

[DataContract] 
public class SomeDTO 
{ 
    [DataMember(Name = "name")] 
    public string Name { get; set; } 
} 

Y debido a que su operación se debe definir definido como:

[OperationContract] 
[WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Bare)]   
FooMessageType Foo(SomeDTO data); 

Si desea que su código actual para trabajar probablemente debería cambiarlo a:

[OperationContract] 
[WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.WrappedRequest)]   
FooMessageType Foo(SomeDTO data); 
+0

Deduzco desnudo y un DTO serían una mejor ¿práctica? – Bullines

4

Inténtelo de BodyStyle=WebMessageBodyStyle.Wrapped

source

6

i tiene el mismo problema. después de establecer BodyStyle = WebMessageBodyStyle.Wrapped resuelto.

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
+0

Lo que Ladislav Mrnka sugirió es una solución alternativa. Pero BodyStyle = WebMessageBodyStyle.Wrapped es una solución adecuada –

0

bodystyle = WebMessageBodyStyle.WrappedRequest trabajó para mí si usted está solicitando a violinistas u otro de descanso clientes pero si usted está solicitando a HttpWebResponse desnudo estaría trabajando