【问题标题】:Posting and receiving json with MVC Web API使用 MVC Web API 发布和接收 json
【发布时间】:2014-05-22 22:31:28
【问题描述】:

我已经看到与我的类似案例得到回答,但我有与其他问题不同的特定需求。

我正在将 json 数据从我的 html 页面发送到 MVC Web API。不幸的是,我收到的数据总是空的(我在这里尝试了很多不同的东西)。问题是我真的需要以 json(字符串)的形式接收数据,因为我的数据非常复杂,不能简单地被 Web API 反序列化(我有自己的自定义反序列化器)。

这是代码!

首先,将接收 ajax post 请求的 web api 控制器

public class ActivityController : ApiController
{
    // POST api/activity
    public string Post([FromBody]string json)
    {
    }
}

然后,ajax 请求本身

$.ajax("/api/activity", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});

就数据而言,它呈现得很好(我已经将相同的请求与 MVC(不是 Web Api)一起使用,并且服务器正在完美地接收字符串......现在由于某种原因,在我的 Web api 中控制器,“json”参数始终为空。正如我之前所说,我将数据作为 json 字符串接收是很重要的。

编辑:我发现我的问题与这个问题重复:POST JSON with MVC 4 API Controller 但我真的不喜欢这个答案...必须创建一个对象只是为了封装字符串很脏...

【问题讨论】:

  • 当我使用无效的 JSON 时,我总是遇到这个问题(它非常严格,请尝试在 Visual Studio 中打开 JSON 文件,它有时会显示其他在线 JSON 验证器中未显示的问题)。不过,我目前遇到的问题似乎是有效的 JSON。您是否尝试过提交非常基本的 JSON,例如 {} ?

标签: c# json asp.net-web-api


【解决方案1】:

我建议您避免使用标准主体参数绑定,因为该机制假定您尝试将主体反序列化为 CLR 对象。试试这个,

public class ActivityController : ApiController
{
    // POST api/activity
    public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
    {
         var jsonString = await request.Content.ReadAsStringAsync();

         return new HttpResponseMessage();
    }
}

如果你真的想使用参数绑定,你可以这样做。

    public HttpResponseMessage Post(JToken jToken)
    {

        return new HttpResponseMessage()
        {
            Content = new StringContent(jToken.ToString())
        };
    }

【讨论】:

  • 我是 Web Api 的新手,但这个接缝非常有趣!您会推荐任何关于此的好文章(使用 HttpRequestMessage 使用异步)吗?顺便说一句,由于某种原因,它使用“ReadAsStringAsync”接收的 json 充满了像“%22%3A%5B%7B%22”这样的字符,而不是普通的“{”和“[”,所以我什么也做不了用它。
  • @zwk 看起来您的 JSON 正在被 URI 编码。你能显示那个代码吗?
  • @zwk 关于异步操作方法,您正在寻找什么?这里有底层细节chimera.labs.oreilly.com/books/1234000001708/…
  • 我不知道你还想看代码的哪一部分,但是对于ajax请求的Http头,数据是正确编码的。至于控制器,我完全按照你的建议做。
  • @zwik 一旦您了解了 HttpContent 类的工作原理并放弃模型绑定垃圾,接收任何类型的内容都是微不足道的。不幸的是,每个人都认为他们想通过网络发送对象。
【解决方案2】:

我在这里可能是错的,但您似乎没有在帖子 URL 中包含您的操作。尝试改变

$.ajax("/api/activity", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});

$.ajax("/api/activity/POST", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});

【讨论】:

  • 是的,你错了。 MVC Web API 的工作方式是通过执行一个 POST 类型的 ajax 请求,您可以访问控制器的 post 方法。无论如何,我的问题不是它无法到达方法,而是参数为空。
【解决方案3】:

请尝试使用 System.Web.Http 上的 [HttpPost] 属性;

public class ActivityController : ApiController
{
    // POST api/activity
    [HttpPost]
    public string Post([FromBody]string json)
    {
    }
}

【讨论】:

  • 我以前试过。不幸的是,它并没有改变任何事情。就 Web API 的工作方式而言,它不应该改变任何东西,但我还是尝试了它,但没有成功......
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 2013-05-30
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2014-09-14
相关资源
最近更新 更多