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