2011-03-21 6 views
11

Vous cherchez des conseils sur un service de repos wcf 4 basé sur l'extension WCF REST Template 40 (CS) dans VS2010. J'ai passé les deux derniers jours à essayer de faire fonctionner ce bugger, en passant en revue d'autres posts, et même si je me suis rapproché, je n'arrive pas à franchir la ligne d'arrivée. Après beaucoup de frustration, il finit par atteindre le service et l'envoi (en utilisant le générateur de requête fiddler) mais le paramètre de la méthode apparaît comme nul, mais il est correctement défini dans le générateur de requête. Je suppose que c'est peut-être une question de config à ce stade, mais comme la date limite approche, je manque de temps pour plus de recherche. FWIW, lors du débogage, la variable jsonstring est nulle. Personnellement, je me pose une question de noob car c'est la première fois que je passe par REST, toute aide serait très appréciée!Service WCF REST JSON Post

Merci d'avance.

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))); 
     } 
    } 

Code service

[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; 
    } 
} 

tête de requête Fiddler

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

corps demande

{"Name":"Frank"} 

réponse brute de Fiddler

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

Oublié de mentionner, la solution utilise IIS 7 pour le serveur web et non le serveur de débogage apnet. – Grogh

Répondre

20

ce lien trébuché à travers WCF + REST: Where is the request data? et vu la réponse de Glenn à passer un courant à la méthode, puis déchirer qu'en dehors avec un StreamReader dans une chaîne pour obtenir les données post de formulaire.

modifié le code de service prototype comme suit

[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; 
} 

Et cela semble faire l'affaire, la gamme complète de JSON est passé dans le flux, lu dans la chaîne locale, et je peux ensuite l'attaquer en utilisant JSON .net pour sérialiser dans/à partir d'un dictionnaire pour passer à la logique métier. Pas vraiment joli, mais fonctionnel.

+0

Trouvé que l'appel de Close et/ou Dispose gâche la réponse, causant un défaut de service "Le message a été éliminé" –

-1

Avez-vous essayé l'attribut au lieu du poste [WebGet (UriTemplate = ..] pour voir si cela fonctionnerait? Voici un exemple - http://blogs.msdn.com/b/kaevans/archive/2007/09/04/creating-a-json-service-with-webget-and-wcf-3-5.aspx

+0

J'ai fait définir une méthode webget qui renvoyait comme prévu, commentant actuellement pour nettoyer le code pour se concentrer sur la publication. Je l'avais en place avec une méthode webinvoke, et trouvé un post sur stackoverflow (ne peut pas le retrouver maintenant) qui dit de ne pas inclure cela. Avant d'enlever je n'étais pas du tout, recevait un 404, après avoir enlevé je reçois maintenant 200 réponses, mais pas de données. N'a pas semblé important si je l'ai laissé comme la racine ("") ou mettre un endpoint dans – Grogh

+0

Quel système d'exploitation et version de IIS, ou IIS Express ou serveur de développement de Web, utilisez-vous? Dans quel cadre le pool d'applications est-il défini? L'erreur 404 peut avoir été en raison d'un problème lié ici http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/2ec269e3-c1ff-4d9b-9ff3-d530f1599047 – sep15ms

+0

2008 r2 sp1 IIS 7 avec .Net 4 enregistré avec aspnet_regiis.exe. Des pointeurs sur où aller dans IIS 7 pour ajouter la DLL référencée? J'essaye aussi de gagner 7 sp1 avec IIS installé, mais je pense que c'est IIS 7.5 ... toujours pas de jus. – Grogh

1

Avez-vous essayé d'entrer {"jsonstring": "Frank"} dans le corps de la requête (dans le Générateur de requêtes de fiddler)?

+0

Je pense que c'est la vraie réponse. Une fois enveloppé, le json est désérialisé dans les arguments de la méthode par son nom. –

2

J'utilise celui-ci et fonctionne:

[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) 
{ 
} 

où shelfId est passé GET, et des expositions sont transmises dans le corps du message sous forme de données JSON.

+8

Pouvez-vous nous montrer quelques exemples de données JSON qui fonctionnent avec cette opération? –

0

Je pense qu'il y a peut-être un problème dans BodyStyle = WebMessageBodyStyle.WrappedRequest, qui - je pense, bien que la documentation ne soit pas entièrement claire - s'attend à ce que l'élément soit enveloppé avec le nom de la méthode.

Définissez cela comme étant déballé et définissez le corps de la demande sur '{"Name":"Frank"}' (remarquez les guillemets simples qui l'entourent, ce que vous êtes en train de publier une chaîne contenant JSON.) Je ne sais pas pourquoi vous voudriez cela.Cela me rappelle http://thedailywtf.com/Articles/XMLd-XML.aspx où ils mettent xml dans leur xml. Vous mettez JSON dans votre JSON.