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