42 votes

ASP.NET - Passer JSON de jQuery à ASHX

J'essaie de passer JSON de jQuery à un fichier .ASHX. Exemple de jQuery ci-dessous:

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

Comment récupérer les données JSON dans mon fichier .ASHX? J'ai la méthode:

 public void ProcessRequest(HttpContext context)
 

mais je ne trouve pas les valeurs JSON dans la demande.

57voto

Claudio Redi Points 34297

Je sais que c'est trop vieux, mais pour mémoire, j'aimerais ajouter mes 5 cents

Vous pouvez lire l'objet JSON sur le serveur avec ce

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

24voto

Andre Points 928

La solution suivante a fonctionné pour moi:

Côté client:

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

Côté serveur .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;
           }
        }
    }
 

4voto

Oleg Points 136406

Si vous envoyez des données vers le serveur à l'égard de l' $.ajax les données ne seront pas convertis en données JSON automatiquement (voir http://stackoverflow.com/questions/2737525/how-do-i-build-a-json-object-to-send-to-an-ajax-webservice/2738086#2738086). Ainsi, vous pouvez utiliser contentType: "application/json; charset=utf-8" et dataType: "json" et de séjour ne convertit pas les données avec JSON.stringify ou $.toJSON. Au lieu de

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

(manuel de la conversion des données en JSON), vous pouvez essayer d'utiliser

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

et d'obtenir les données sur le côté serveur avec context.Request.QueryString["file"] et context.Request.QueryString["type"] des constructions. Si vous ne recevez quelques problèmes avec cette façon, alors vous pourriez essayer avec

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

et l'utilisation de la DataContractJsonSerializer sur le côté serveur.

2voto

oyaebunterkrah Points 46
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; } }
}

1voto

Cela fonctionne pour appeler des services Web. Pas sûr 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";
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X