Ответ 1
Я знаю, что это слишком старо, но для записи я хотел бы добавить свои 5 центов
Вы можете прочитать объект JSON на сервере с помощью этого
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Я пытаюсь передать JSON из jQuery в файл .ASHX. Пример jQuery ниже:
$.ajax({
type: "POST",
url: "/test.ashx",
data: "{'file':'dave', 'type':'ward'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
});
Как получить данные JSON в моем файле .ASHX? У меня есть метод:
public void ProcessRequest(HttpContext context)
но я не могу найти значения JSON в запросе.
Я знаю, что это слишком старо, но для записи я хотел бы добавить свои 5 центов
Вы можете прочитать объект JSON на сервере с помощью этого
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Для меня работало следующее решение:
Сторона клиента:
$.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);
}
});
Серверная сторона .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;
}
}
}
Если вы отправляете данные на сервер в отношении $.ajax
, данные не будут автоматически преобразованы в данные JSON (см. Как создать объект JSON для отправки в AJAX WebService?). Поэтому вы можете использовать contentType: "application/json; charset=utf-8"
и dataType: "json"
и не преобразовывать данные с помощью JSON.stringify
или $.toJSON
. Вместо
data: "{'file':'dave', 'type':'ward'}"
(ручное преобразование данных в JSON) вы можете попробовать использовать
data: {file:'dave', type:'ward'}
и получить данные со стороны сервера с конструкциями context.Request.QueryString["file"]
и context.Request.QueryString["type"]
. Если у вас есть некоторые проблемы с этим способом, вы можете попробовать
data: {file:JSON.stringify(fileValue), type:JSON.stringify(typeValue)}
и использование DataContractJsonSerializer
на стороне сервера.
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; } }
}
Это работает для вызова веб-сервисов. Не уверен насчет .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";
}
вам необходимо определить свойства обработчика в файле веб-конфигурации для обработки пользовательских форматов запросов на расширение. здесь пользовательское расширение ".api"
добавить глагол = "*" path = "test.api" type = "test" замените url: "/test.ashx" на url: "/test.api" .
если использовать $.ajax и использовать .ashx для получения запроса, не устанавливайте тип данных
$.ajax({
type: "POST",
url: "/test.ashx",
data: {'file':'dave', 'type':'ward'},
**//contentType: "application/json; charset=utf-8",
//dataType: "json"**
});
Я заработает!
Попробуйте System.Web.Script.Serialization.JavaScriptSerializer
С кастингом в словарь