使用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应用程序。

任何帮助都将是感激的。

使用restsharp在WCF web api服务上发布

我注意到你正在把游戏作为一个参数,并在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失败。