asp.net ajax ashx

ASP.NET-Pasando JSON de jQuery a ASHX



ajax (8)

Estoy intentando pasar JSON de jQuery a un archivo .ASHX. Ejemplo de la 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.


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


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


Pruebe System.Web.Script.Serialization.JavaScriptSerializer

Con casting al diccionario


Sé que esto es demasiado viejo, pero solo para el registro 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();


Si envía datos al servidor con respecto a $.ajax los datos no se convertirán a datos JSON automáticamente (consulte ¿Cómo compilo un objeto JSON para enviar a un servicio web AJAX? ). Por lo tanto, puede usar contentType: "application/json; charset=utf-8" y dataType: "json" y permanecer no convierte los 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 obtenga los datos del lado del servidor con las construcciones context.Request.QueryString["file"] y context.Request.QueryString["type"] . Si recibe algunos problemas con esta forma, entonces podría intentar con

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

y el uso de DataContractJsonSerializer en el lado del servidor.


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 consigo trabajo!


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"

agregar verbo = "*" ruta = "test.api" tipo = "prueba" reemplazar la url: "/test.ashx" a url: "/test.api" .


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