2011-10-10 2 views
1

En essayant d'envoyer des informations dans mon API qui est programmé en utilisant WCF Web Api. Dans le client, j'utilise restsharp qui est un client de repos pour des services reposants. Cependant, lorsque j'essaie d'ajouter des paramètres à la requête, la méthode post du service n'est jamais appelée, et mon objet de réponse dans le client obtient un statut 500 (erreur interne du serveur), mais quand je commente les lignes où je ' En ajoutant des paramètres, la requête atteint la méthode post exposée dans le service.Publication http sur un service d'API web WCF en utilisant restsharp

Voici le code du client:

[HttpPost] 
    public ActionResult Create(Game game) 
    { 
     if (ModelState.IsValid) 
     { 
      var request = new RestRequest(Method.POST); 
      var restClient = new RestClient(); 
      restClient.BaseUrl = "http://localhost:4778"; 
      request.Resource = "games"; 
      //request.AddParameter("Name", game.Name,ParameterType.GetOrPost); this is te line when commented  everything works fine 
      RestResponse<Game> g = restClient.Execute<Game>(request); 
      return RedirectToAction("Details", new {id=g.Data.Id }); 
     } 
     return View(game); 
    } 

Voici le code pour le service:

[WebInvoke(UriTemplate = "", Method = "POST")] 
    public HttpResponseMessage<Game> Post(Game game, HttpRequestMessage<Game> request) 
    { 
     if (null == game) 
     { 
      return new HttpResponseMessage<Game>(HttpStatusCode.BadRequest); 
     } 
     var db = new XBoxGames(); 
     game = db.Games.Add(game); 
     db.SaveChanges(); 

     HttpResponseMessage<Game> response = new HttpResponseMessage<Game>(game); 
     response.StatusCode = HttpStatusCode.Created; 

     var uriBuilder = new UriBuilder(request.RequestUri); 
     uriBuilder.Path = string.Format("games/{0}", game.Id); 
     response.Headers.Location = uriBuilder.Uri; 
     return response; 
    } 

Je dois ajouter des paramètres à ma demande si l'objet de jeu dans le service se peuplé, mais je ne sais pas comment le faire, si le service casse chaque fois que j'essaie d'ajouter des paramètres.

J'ai oublié de mentionner que le client et le serveur sont des applications .NET MVC 3.

Toute aide serait l'apprécier. Merci d'avance.

Répondre

1

J'ai remarqué que vous prenez Game comme paramètre et dans HttpRequestMessage. Vous n'avez pas besoin de faire ça. Une fois que vous avez la demande (c'est-à-dire votre paramètre de demande), vous pouvez appeler ReadAs sur la propriété de contenu et vous obtiendrez l'instance de jeu. Le fait que vous passez deux fois le jeu cause probablement le problème. Pouvez-vous essayer de supprimer votre deuxième paramètre de jeu et juste utiliser celui dans la réponse?

L'API Web de WCF prend en charge le codage d'URL de formulaire. Dans Preview 5, si vous utilisez la méthode d'extension MapServiceRoute, elle sera automatiquement câblée. Si ce n'est pas le cas, créez un objet WebApiConfiguration et transmettez-le à votre ServiceHostFactory/ServiceHost.

+0

Problème résolu. Merci beaucoup! – Daniel

0

Je ne suis pas familier avec les objets que vous appelez mais est game.Name une chaîne? Si ce n'est pas le cas, cela peut expliquer pourquoi AddParameter échoue.

+0

Oui, c'est une chaîne. – Daniel

1

Eh bien après avoir contourné ce problème encore et encore, j'ai finalement trouvé une solution, mais je ne peux pas expliquer pourquoi cela se produit.

J'ai remplacé la méthode addParameter pour addBody, et tout a fonctionné comme prévu, je pourrais publier des informations sur le serveur. Le problème semble être que chaque fois que j'ajoute des paramètres via la méthode addParameter, cette méthode va ajouter des paramètres comme application/x-www-form-urlencoded, et apparemment web api WCF ne supporte pas ce type de données, et C'est pourquoi il renvoie une erreur de serveur interne au client.

Par contre, la méthode addBody utilise du texte/xml que le serveur peut comprendre.

Encore une fois, je ne sais pas si c'est ce qui se passe réellement, mais il semble que ce soit cela.

Voici comment mon code client ressemble maintenant:

[HttpPost]   
    public ActionResult Create(Game game) 
    { 
     if (ModelState.IsValid) 
     { 
      RestClient restClient = new RestClient("http://localhost:4778"); 
      RestRequest request = new RestRequest("games/daniel",Method.POST); 
      request.AddBody(game); 
      RestResponse response = restClient.Execute(request); 
      if (response.StatusCode != System.Net.HttpStatusCode.InternalServerError) 
      { 
       return RedirectToAction("Index"); 
      } 
     } 
     return View(game); 

S'il vous plaît si vous avez des commentaires, ou savoir ce qui se passe laissez-moi savoir.

Questions connexes