今天在使用Jquery的ajax方法发送请求时,发现在后台中使用ashx文件无法接收到ajax方法中传递的参数,上网查了一下原因后发现了问题所在,原来是我在$.ajax方法中指明了”contentType: ‘application/json; charset=utf8′”,所以才导致了在ashx文件中处理请求时无法获取传递到服务器端的参数, 正确的写法如下: $.ajax({ url: '/Handler.ashx?operFlag=test', type: 'POST', /* 请求ashx文件的时候 要把contentType去掉,还有就是 data 格式为 {”key”,”val 在使用jQuery的$.ajax()方法向服务器发送异步请求时,有时可能会遇到在ASHX(ASP.NET HTTP Handler)文件中无法正确接收数据的问题。本文将深入探讨这个问题的原因以及解决方案。 ASHX文件是ASP.NET中处理HTTP请求的一种轻量级方式,它可以处理自定义的HTTP请求,并返回任意类型的数据。当使用$.ajax()方法发送POST请求时,如果在请求头中设置了`contentType: 'application/json; charset=utf8'`,那么前端发送的数据将以JSON格式编码。然而,ASHX文件默认并不解析JSON格式的数据,而是期望接收到URL编码或表单编码的数据。 在问题描述中,作者遇到的情况是,当设置`contentType: 'application/json; charset=utf8'`并使用JSON对象作为`data`时,ASHX文件无法通过`context.Request["key"]`获取参数。解决这个问题的关键在于,需要去掉`contentType`设置,或者改变`data`的格式,使其符合ASHX处理的预期。例如: ```javascript $.ajax({ url: '/Handler.ashx?operFlag=test', type: 'POST', // 去掉 contentType 设置,或者使用如下数据格式 data: {"key": "xdp", "key2": "孤傲苍狼"}, cache: false, dataType: 'text', success: function(data) { alert(data); }, error: function(xhr) { alert("出现错误,请稍后再试:" + xhr.responseText); } }); ``` 这样,ASHX文件就可以通过`context.Request["key"]`和`context.Request["key2"]`获取到对应的值了。 然而,如果前端使用`JSON.stringify()`将数据转换成JSON字符串,如: ```javascript data: JSON.stringify({"key": "xdp-gacl", "key2": "白虎神皇"}), ``` 这时,即使去掉`contentType`设置,ASHX文件也无法直接通过`context.Request`获取到数据。因为ASHX不理解JSON格式,我们需要在服务器端解析这个JSON字符串。一种解决方法是创建一个通用的方法来读取请求的输入流,然后反序列化JSON数据: ```csharp private Dictionary<String, Object> GetParameter(HttpContext context) { StreamReader reader = new StreamReader(context.Request.InputStream); string requestBody = reader.ReadToEnd(); JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Deserialize<Dictionary<String, Object>>(requestBody); } ``` 这样,我们可以在ASHX文件中调用`GetParameter(context)`来获取前端发送的JSON数据,然后通过键值对访问它们。 总结来说,当使用$.ajax()向ASHX发送数据时,需要注意数据格式和请求头的设置。如果发送的是JSON数据,需要在服务器端进行相应的处理才能正确解析和访问这些数据。对于常规的键值对数据,保持默认或使用URL编码或表单编码格式通常可以避免这类问题。了解这些细节对于优化前后端通信效率和解决相关问题至关重要。
- 粉丝: 5
- 资源: 931
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助