web-dev-qa-db-fra.com

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.

42
colin jobes

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();
55
Claudio Redi

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

Si vous envoyez des données au serveur en respectant $.ajax les données ne seront pas converties automatiquement en données JSON (voir Comment créer un objet JSON à envoyer à un AJAX WebService? ). Vous pouvez donc utiliser contentType: "application/json; charset=utf-8" et dataType: "json" et ne convertissez pas les données avec JSON.stringify ou $.toJSON. Au lieu de

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

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

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

et récupérez les données côté serveur avec context.Request.QueryString["file"] et context.Request.QueryString["type"] constructions. Si vous rencontrez des problèmes de cette façon, vous pouvez essayer avec

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

et utilisation DataContractJsonSerializer côté serveur.

4
Oleg
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
oyaebunterkrah

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";
}
1
Larry Flewwelling

vous devez définir les propriétés du gestionnaire dans le fichier de configuration Web pour gérer les formats de demande d'extension définis par l'utilisateur. ici l'extension définie par l'utilisateur est ". api"

ajouter le verbe = "*" path = "test.api" type = "test" remplacer le rl: "/test.ashx" à rl:" /test.api".

0
Ashish Sharma