2011-03-21 28 views
11

Buscando alguna guía sobre un servicio wcf 4 de descanso que se basa en la extensión WCF REST Template 40 (CS) en VS2010. He pasado los últimos días intentando que este insector funcione, revise otras publicaciones, y aunque me he acercado, parece que no puedo cruzar la línea de meta. Después de mucha frustración, finalmente está afectando el servicio y la publicación (usando el creador de solicitudes de fiddler), pero el parámetro del método aparece como nulo, pero se está configurando correctamente en el generador de solicitudes. Supongo que puede ser un problema de configuración en este punto, pero a medida que se acerca la fecha límite, me estoy quedando sin tiempo para más investigación. FWIW, en la depuración, la variable jsonstring es nula. Es cierto que soy una pregunta novato, ya que esta es la primera vez que me encuentro con REST, ¡cualquier ayuda sería muy apreciada!WCF REST Servicio JSON Publicar datos

Gracias de antemano.

web.config

<system.web> 
    '<compilation debug="true" targetFramework="4.0" /> 
</system.web> 

<system.webServer> 
<modules runAllManagedModulesForAllRequests="true"> 
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
</modules> 
</system.webServer> 

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/> 
    </webHttpEndpoint> 
</standardEndpoints> 
</system.serviceModel> 

global.asax.cs

public class Global : HttpApplication 
    { 
     void Application_Start(object sender, EventArgs e) 
     { 
     RegisterRoutes(); 
     } 

     private void RegisterRoutes() 
     { 
     RouteTable.Routes.Add(new ServiceRoute("Scoring", new WebServiceHostFactory(), typeof(ScoringSvc))); 
     } 
    } 

Código de servicio

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class ScoringSvc 
{ 
    [OperationContract] 
    [WebInvoke 
     (Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat=WebMessageFormat.Json, 
     ResponseFormat=WebMessageFormat.Json)] 
    public string BOB(string jsonstring) 
    { 
     return "Received: " + jsonstring; 
    } 
} 

violinista encabezado de solicitud

Host: localhost 
Content-Length: 20 
Content-Type: application/json; charset=UTF-8 

solicitud cuerpo

{"Name":"Frank"} 

respuesta cruda de violinista

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 12 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Mon, 21 Mar 2011 21:31:14 GMT 

"Received: " 
+0

Olvidé mencionar que la solución usa IIS 7 para el servidor web y no para el servidor de depuración de apnet. – Grogh

Respuesta

20

Tropezamos con este enlace WCF + REST: Where is the request data? y observamos la respuesta de Glenn para pasar una secuencia al método y luego descomponerlo junto con un secuenciador en una cadena para obtener los datos de la entrada del formulario.

modificado el código de servicio prototipo de la siguiente manera

[OperationContract] 
[WebInvoke 
    (UriTemplate="/BOB", 
    Method = "POST", 
    BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
public string BOB (Stream streamdata) 
{ 
    StreamReader reader = new StreamReader(streamdata); 
    string res = reader.ReadToEnd(); 
    reader.Close(); 
    reader.Dispose(); 
    return "Received: " + res; 
} 

Y eso parece hacer el truco, la matriz JSON completa se pasa en la corriente, lea en la cadena local y luego pueden atacar usando JSON .net para serializar en/desde un diccionario para pasar a la lógica comercial. No es realmente bonito, sino funcional.

+0

Encontré que llamar a Close y/o Dispose causa un error en la respuesta, provocando un error de servicio "Mensaje eliminado" –

-1

¿Ha probado el [WebGet (UriTemplate = ..] atribuyen en lugar de la entrada para ver si eso funcionaría? Aquí hay un ejemplo: http://blogs.msdn.com/b/kaevans/archive/2007/09/04/creating-a-json-service-with-webget-and-wcf-3-5.aspx

+0

Tuve un método webget definido que volvió como se esperaba, comentado actualmente para limpiar el código y centrarse en la publicación. Lo tenía en su lugar con un método webinvoke, y encontré una publicación en stackoverflow (no puedo encontrarla ahora) que dice que no incluye eso. Antes de eliminarlo no estaba llegando a nada, estaba recibiendo un código 404, después de eliminarlo ahora obtengo 200 respuestas, pero no datos. No parecía importar si lo dejé como raíz ("") o poner un punto final en – Grogh

+0

¿Qué sistema operativo y versión de IIS, o IIS Express o servidor de desarrollo web, está utilizando? ¿En qué marco está configurado el grupo de aplicaciones? El error 404 puede deberse a un problema relacionado aquí http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/2ec269e3-c1ff-4d9b-9ff3-d530f1599047 – sep15ms

+0

2008 r2 sp1 IIS 7 con .Net 4 registrado con aspnet_regiis.exe. ¿Alguna sugerencia sobre dónde ir en IIS 7 para agregar el dll al que se hace referencia? También probando win 7 sp1 con IIS instalado, pero creo que eso es IIS 7.5 ... aunque todavía no jugué. – Grogh

1

¿Ha intentado ingresar {"jsonstring": "Frank"} en el cuerpo de la solicitud (dentro del Creador de solicitudes de violín)?

+0

Creo que esta es la respuesta real. Cuando se envuelve, el json se deserializa en el método argumentos por nombre. –

2

utilizo éste y obras:

[WebInvoke(ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.WrappedRequest, 
      Method = "POST", 
      UriTemplate = "setExpositions?shelfId={shelfId}")] 
[OperationContract] 
public bool SetExpositions(int shelfId, List<WcfExposition> expositions) 
{ 
} 

donde shelfId se pasa en GET y exposiciones se pasan en el cuerpo del mensaje como datos JSON.

+8

¿Puede mostrarnos algunos datos JSON de ejemplo que funcionan con esta operación? –

0

Creo que puede haber un problema en BodyStyle = WebMessageBodyStyle.WrappedRequest, que creo que, aunque la documentación no está del todo clara, espero que el elemento se envuelva con el nombre del método.

Conjunto que desenvolvió, y establecer el cuerpo de la solicitud a '{"Name":"Frank"}' (observe las comillas simples que lo rodean. Lo que realmente está publicando una cadena que contiene JSON. No tengo idea de por qué quiere esto.Me recuerda http://thedailywtf.com/Articles/XMLd-XML.aspx donde están poniendo xml en su xml. Usted está poniendo JSON en su JSON.

Cuestiones relacionadas