Pregunta 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.


41
2018-06-01 09:35


origen


Respuestas:


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();

54
2018-01-03 15:16



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

24
2017-07-08 18:55



Si envía datos al servidor con respecto a $.ajax los datos no se convertirán a datos JSON automáticamente (ver ¿Cómo construyo un objeto JSON para enviar a un WebService de AJAX?) Entonces puedes usar contentType: "application/json; charset=utf-8" y dataType: "json" y quédate, no conviertas 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 context.Request.QueryString["file"] y context.Request.QueryString["type"] construcciones 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.


4
2018-06-01 10:57



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

2
2017-09-12 09:44



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

1
2017-09-20 20:10



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" Reemplace la url: "/test.ashx" a url: "/test.api" .


0
2017-09-21 12:16



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!


-1
2017-08-05 10:54