ASP.NET – 从JQuery传递JSON到ASHX

我试图从JQuery传递JSON到.ASHX文件。 下面的jQuery示例:

$.ajax({ type: "POST", url: "/test.ashx", data: "{'file':'dave', 'type':'ward'}", contentType: "application/json; charset=utf-8", dataType: "json", }); 

如何检索我的.ASHX文件中的JSON数据? 我有方法:

 public void ProcessRequest(HttpContext context) 

但是我找不到请求中的JSON值。

我知道这太旧了,但是为了logging,我想加5分钱

你可以用这个读取服务器上的JSON对象

 string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 

以下解决scheme为我工作:

客户端:

  $.ajax({ type: "POST", url: "handler.ashx", data: { firstName: 'stack', lastName: 'overflow' }, // DO NOT SET CONTENT TYPE to json // contentType: "application/json; charset=utf-8", // DataType needs to stay, otherwise the response object // will be treated as a single string dataType: "json", success: function (response) { alert(response.d); } }); 

服务器端.ashx

  using System; using System.Web; using Newtonsoft.Json; public class Handler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string myName = context.Request.Form["firstName"]; // simulate Microsoft XSS protection var wrapper = new { d = myName }; context.Response.Write(JsonConvert.SerializeObject(wrapper)); } public bool IsReusable { get { return false; } } } 

如果您向$.ajax发送数据到服务器,则数据将不会自动转换为JSON数据(请参阅如何构build发送到AJAX WebService的JSON对象? )。 因此,您可以使用contentType: "application/json; charset=utf-8"dataType: "json"并保持不使用JSON.stringify$.toJSON转换数据。 代替

 data: "{'file':'dave', 'type':'ward'}" 

(手动将数据转换为JSON),您可以尝试使用

 data: {file:'dave', type:'ward'} 

并使用context.Request.QueryString["file"]context.Request.QueryString["type"]构造获取服务器端的数据。 如果你确实收到了这样的问题,那么你可以尝试一下

 data: {file:JSON.stringify(fileValue), type:JSON.stringify(typeValue)} 

并在服务器端使用DataContractJsonSerializer

 html <input id="getReport" type="button" value="Save report" /> js (function($) { $(document).ready(function() { $('#getReport').click(function(e) { e.preventDefault(); window.location = 'pathtohandler/reporthandler.ashx?from={0}&to={1}'.f('01.01.0001', '30.30.3030'); }); }); // string format, like C# String.prototype.format = String.prototype.f = function() { var str = this; for (var i = 0; i < arguments.length; i++) { var reg = new RegExp('\\{' + i + '\\}', 'gm'); str = str.replace(reg, arguments[i]); } return str; }; })(jQuery); c# public class ReportHandler : IHttpHandler { private const string ReportTemplateName = "report_template.xlsx"; private const string ReportName = "report.xlsx"; public void ProcessRequest(HttpContext context) { using (var slDocument = new SLDocument(string.Format("{0}/{1}", HttpContext.Current.Server.MapPath("~"), ReportTemplateName))) { context.Response.Clear(); context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", ReportName)); try { DateTime from; if (!DateTime.TryParse(context.Request.Params["from"], out from)) throw new Exception(); DateTime to; if (!DateTime.TryParse(context.Request.Params["to"], out to)) throw new Exception(); ReportService.FillReport(slDocument, from, to); slDocument.SaveAs(context.Response.OutputStream); } catch (Exception ex) { throw new Exception(ex.Message); } finally { context.Response.End(); } } } public bool IsReusable { get { return false; } } } 

这适用于调用Web服务。 不确定.ASHX

 $.ajax({ type: "POST", url: "/test.asmx/SomeWebMethodName", data: {'file':'dave', 'type':'ward'}, contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { $('#Status').html(msg.d); }, error: function(xhr, status, error) { var err = eval("(" + xhr.responseText + ")"); alert('Error: ' + err.Message); } }); [WebMethod] public string SomeWebMethodName(string file, string type) { // do something return "some status message"; } 

您必须在Webconfiguration文件中定义处理程序属性来处理用户定义的扩展请求格式。 这里用户定义的扩展名是“ .api”

将verb =“*”path =“test.api”type =“test”replace为url:“/test.ashx”url:“/test.api”

如果使用$ .ajax并使用.ashx来获取查询string,则不设置数据types

 $.ajax({ type: "POST", url: "/test.ashx", data: {'file':'dave', 'type':'ward'}, **//contentType: "application/json; charset=utf-8", //dataType: "json"** }); 

我得到它的工作!

尝试System.Web.Script.Serialization.JavaScriptSerializer

铸造到字典