ASP.NET – Pasando JSON de jQuery a ASHX

Estoy tratando de pasar JSON de jQuery a un archivo .ASHX. Ejemplo de jQuery a continuación:

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

¿Cómo recupero los datos JSON en mi archivo .ASHX? Tengo el método:

 public void ProcessRequest(HttpContext context) 

pero no puedo encontrar los valores JSON en la solicitud.

Sé que esto es demasiado viejo, pero para que quede constancia, me gustaría agregar mis 5 centavos

Puede leer el objeto JSON en el servidor con este

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

La siguiente solución funcionó para mí:

Lado del cliente:

  $.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); } }); 

Server Side .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; } } } 

Si envía datos al servidor con respecto a $.ajax los datos no se convertirán a datos JSON automáticamente (consulte ¿Cómo construyo un objeto JSON para enviarlo a un servicio web AJAX? ). De modo que puede usar contentType: "application/json; charset=utf-8" y dataType: "json" y stay no convierta datos con JSON.stringify o $.toJSON . En lugar de

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

(conversión manual de datos a JSON) puede intentar usar

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

y obtener los datos en el lado del servidor con las construcciones context.Request.QueryString["file"] y context.Request.QueryString["type"] . Si recibes algunos problemas de esta manera, entonces podrías intentar con

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

y uso DataContractJsonSerializer en el lado del servidor.

 html  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; } } } 

Esto funciona para llamar a servicios web. No estoy seguro de .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"; } 

debe definir las propiedades del controlador en el archivo de configuración web para manejar los formatos de solicitud de extensión definidos por el usuario. aquí la extensión definida por el usuario es ” .api”

add verb = “*” path = “test.api” type = “test” reemplazar la url: “/test.ashx” a url: “/test.api” .

si usa $ .ajax y usa .ashx para obtener la cadena de consulta, no configure el tipo de datos

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

lo hago funcionar!

Pruebe System.Web.Script.Serialization.JavaScriptSerializer

Con la conversión al diccionario