【问题标题】:How to retrieve JSON via ASP.Net context.Request如何通过 ASP.Net context.Request 检索 JSON
【发布时间】:2010-08-03 17:12:52
【问题描述】:
var OrderInfo = {"ProductID": 
    "ProductIDValue",
    "ProductName": "ProductName",
    "Quantity": 1,
    "Amount": 9999,
    "SLQuantity": 9999,
    "SLDate": "08/03/2010"
};

var DTO = { 'OrderInfo': OrderInfo };
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "JasonHandler.ashx",
    data: JSON.stringify(DTO),
    dataType: "json"
 });

我正在尝试通过以下代码在 ASHX 文件中检索服务器端发布的 JSON 数据:

string strrequest = context.Request["OrderInfo"];

但它总是返回 null。我做错了什么?

【问题讨论】:

  • 我倾向于将其发布到 .asmx 文件上的 web 方法中,并从 webmethod 的对象中提取参数,而不是使用 ashx。

标签: jquery asp.net contextmenu


【解决方案1】:
  1. HttpContext.Current.Request.InputStream获取请求正文。
  2. 读取输入流并转换为字符串
  3. 使用javascriptserializer将json对象反序列化为强类型对象(确保json属性与强类型对应部分同名)

【讨论】:

    【解决方案2】:

    来自http://dailydotnettips.com/2013/09/26/sending-raw-json-request-to-asp-net-from-jquery/

    var jsonString = String.Empty;
    
    context.Request.InputStream.Position = 0;
    using (var inputStream = new StreamReader(context.Request.InputStream))
    {
    jsonString = inputStream.ReadToEnd();
    }
    
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    object serJsonDetails = javaScriptSerializer.Deserialize(jsonString, typeof(object));
    

    【讨论】:

    • 这对我有用,将请求上下文流位置设置回 0,谢谢!
    【解决方案3】:

    挖掘互联网。我发现 IE 无法完整接收 POST 请求。 @ronaldwidha 对 InputStream 的建议与我发现的类似。但我没有使用 javascriptserializer,而是使用 JSON.NET 代码 sn-ps 如下,我希望这能帮助其他有类似问题的人

     public class JasonHandler : IHttpHandler {
    
     public void ProcessRequest (HttpContext context) {
    
        context.Response.ContentType = "application/json";
        context.Response.ContentEncoding = Encoding.UTF8;
    
        System.IO.Stream body = context.Request.InputStream;
        System.Text.Encoding encoding = context.Request.ContentEncoding;
        System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
        if (context.Request.ContentType != null)
        {
            context.Response.Write("Client data content type " + context.Request.ContentType);
        }
        string s = reader.ReadToEnd();
        string[] content = s.Split('&');
        for (int i = 0; i < content.Length; i++)
        {
            string[] fields = content[i].Split('=');
            //context.Response.Write("<div><strong>" + fields[0] + "</strong></div>");
            //context.Response.Write("<div>" + fields[1] + "</div> ");  
        }
    
        string jsonRecord = s;
       }
    }
    

    【讨论】:

    • 我不确定您是否建议@ronaldwidha 的建议与 IE 不兼容?这就是你使用 JSON.NET 的原因吗?还是只是偏好?
    【解决方案4】:

    Request[] 只会查看表单参数和 quetystring。您需要自己做一个表单发布或使用 qs 或解析请求正文。

    【讨论】:

      【解决方案5】:

      我认为您可以从 HttpCurrent.Context.Request.GetResponse() 中获取请求正文。

      首先验证内容类型标头可能是个好主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 2015-11-02
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多