【问题标题】:How to receive JSON data in ASMX web service如何在 ASMX Web 服务中接收 JSON 数据
【发布时间】:2020-08-11 18:25:24
【问题描述】:

我正在尝试编写一个 ASMX Web 服务来接收来自其他地方的 JSON 数据块(这意味着我无法控制数据的格式 - 它已记录且一致,但不在我的控制范围内)。作为测试,我创建了一个简单的网页,通过 AJAX 请求发送相同的数据。数据肯定作为我的 POST 请求的有效负载附加: Picture of chrome devtools showing payload

但是当我尝试在我的 ASMX 网络服务中接收该数据时,我得到一个空字符串:

  [WebMethod]
  public string UpdateProjectImage() 
  {
    using (var sr = new System.IO.StreamReader(HttpContext.Current.Request.InputStream))
    {
      string json = sr.ReadToEnd(); // this comes out as an empty string!
      return json;
    }
  }

请注意,这是使用在 Win2008R2 上运行的 VS 2012 和 IIS 7.5 构建的,我无法更改技术堆栈。

streamreader 技术应该可以工作,因为我从另一个正在工作的 web 服务中复制了它 - 但在这种情况下它不起作用(它只是给我一个空字符串),我不知道为什么。这可能是一些奇怪的配置设置,但我只是不知道它可能是什么设置。

【问题讨论】:

  • 在调用 read 之前,您是否运行调试器来查找 sr.EndOfStream 或流的 Position
  • sr.EndOfStream 在“ReadToEnd()”调用之前为“true”。 “位置”不能直接访问,但我发现它隐藏在流对象中,它的值为 194(恰好是 JSON 数据的长度)。所以好像magic-microsoft-land中的某些东西已经读取了数据。有没有办法告诉它不要阅读它?还是一种“倒带”流的方法?
  • 你是怎么调用asmx代码的?使用 ajax?
  • 做到了! - 流对象没有位置,但如果我设置 sr.BaseStream.Position = 0,那么“sr.ReadToEnd()”调用会为我提供所有数据。谢谢!!!

标签: c# asmx


【解决方案1】:

显然我必须在调用 sr.ReadToEnd() 之前设置 sr.BaseStream.Position = 0。我不是 100% 这是“正确”的解决方案(我在其他地方做过,我不需要设置位置,而且必须这样做似乎很奇怪),但它现在正在工作,这已经足够好了对我来说。

特别感谢 Jasen 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2012-07-17
    • 2023-04-06
    • 2010-09-22
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多