6

我有一个 Web API 服务,我正在尝试使用 RestSharp 通过控制台访问它。我的 RestSharp 代码如下所示:

            RestClient client = new RestClient(baseUrlString);
        RestRequest request = new RestRequest("controllername/actionname");
        request.RequestFormat = DataFormat.Json;

        ProcessQuestion model = new ProcessQuestion()
        {
            Id = "123456",
            InstanceId = "123",
            UniqueId = "bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626",
            PostedAnswer = new Dictionary<string, string>() { { "question_7907_1", "selected" }, { "question_7907_2", "selected" } }
        };
        request.AddBody(model);

        var response = client.Execute(request)

我的 Web API 操作采用与上述模型具有相同参数的模型。调用执行时,绑定失败,参数为空。我怀疑这是由于 RestRequest.AddBody 方法将 application/json 附加到正文值,如下所示:

{application/json={"Id":"123456","InstanceId":"123","UniqueId":"bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626","PostedAnswer":{"question_7907_1":"selected","question_7907_2":"selected"}}}

如果我使用 Fiddler 发布,主体会正确绑定到模型。下面是我在 Fiddler 中提供的 body 值:

{'Id':'123456','InstanceId':'123','Uniqueid':'bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626','PostedAnswer':{'question_7907_1':'selected','question_7907_2':'selected'}}

请注意,fiddler 中的 body 值是相同的,只是在前面添加了 application/json 键。

还要注意:我已经尝试了看起来像所有的东西......我已经在操作中分离了参数,使用了 FromBody 和 FromUri 属性,尝试了自定义 DictionaryModelBinder,尝试了自定义 ValueBinders,尝试改变我使用 RestSharp 的方式(带有 RequestBody 参数的 AddParameter、AddObject、不同的 URL 样式等)。

有没有其他人遇到过这个,如果有,你解决了吗?我为此服务选择了 Web API,希望模型绑定能够像在 MVC 中那样工作,但我发现情况并非如此。

谢谢

编辑(已解决):RestSharp 自动将 JsonSerializer 用于在 AddBody 方法中传递的对象。我想我错过了一些简单的东西,实际上我是......将 Method.Post 参数添加到 RestRequest 实例化解决了这个问题。

4

1 回答 1

8
  1. 创建请求时指定方法:

    RestRequest request = new RestRequest("controllername/actionname", Method.POST);

  2. 不确定 body 的默认序列化程序是什么 - 您可以尝试使其明确:

    request.AddBody(request.JsonSerializer.Serialize(model));

  3. 我不确定“应用程序/json”的来源——这是您应该随请求发送的 Content-Type 标头,绝对不是正文的一部分。所以改为这样做:

    request.AddHeader("Content-type", "application/json; charset=utf-8");

  4. 如果这没有帮助,请尝试使您的代码尽可能与他们网站上的示例相似。尝试消除复杂性(即使这意味着更改所需的功能)——让它工作到一定程度,并在此基础上构建额外的功能。

http://restsharp.org/

于 2013-05-10T18:27:35.250 回答