使用restsharp在WCF web api服务上发布
本文关键字:服务 api web restsharp WCF 使用 | 更新日期: 2023-09-27 18:10:48
我试图在我的api中发布一些信息,这是使用WCF Web api编程的。在客户端,我使用restsharp,这是restful服务的rest客户端。但是,当我尝试向请求添加一些参数时,服务中的post方法从未被调用,并且客户端的响应对象获得500状态(内部服务器错误),但是当我注释添加参数的行时,请求到达服务中暴露的post方法。
下面是客户端的代码:[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);
}
服务的代码如下:
[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;
}
我需要添加参数到我的请求,所以游戏对象在服务中被填充,但我不知道如何做到这一点,如果每次我试图添加参数服务中断。
我忘了说客户端和服务器端都是。net MVC 3应用程序。
任何帮助都将是感激的。
我注意到你正在把游戏作为一个参数,并在HttpRequestMessage。你不需要这么做。一旦你有了请求(即你的请求参数),你可以在Content属性上调用ReadAs,你将获得游戏实例。事实上,你通过游戏两次可能是导致问题。你可以尝试删除你的第二个游戏参数,只是使用一个在响应?
WCF Web API支持表单url编码。在预览5中,如果你使用MapServiceRoute扩展方法,它将被自动连接起来。如果不是,那么创建一个WebApiConfiguration对象,并将其传递给ServiceHostFactory/ServiceHost。
在反复思考这个问题之后,我终于找到了一个解决方案,然而,我无法解释为什么会发生这种情况。
我为addBody替换了addParameter方法,一切都如预期的那样工作,我可以在服务器上发布信息。
问题似乎是,每当我通过addParameter方法添加参数时,该方法将附加参数为application/x-www-form-urlencoded,显然WCF web api不支持这种类型的数据,这就是为什么它返回一个内部服务器错误给客户端。
相反,addBody方法使用服务器可以理解的text/xml。
再一次,我不知道这是不是真的发生了,但似乎是这样。
这是我的客户端代码现在的样子:
[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);
如果你有任何反馈,或者知道发生了什么,请告诉我。
我不熟悉你正在调用的对象,但它是游戏。命名一个字符串?如果不是,这可能解释了为什么AddParameter失败。