ASP.NET – передача JSON из jQuery в ASHX

Я пытаюсь передать 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  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»

add verb = “*” 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

С литьем в словарь

  • Поставщик несовместим с версией клиента Oracle
  • Пользовательская авторизация в Asp.net WebApi - какой беспорядок?
  • Остановить onclick при стрельбе, когда onclientclick является ложным?
  • Как заставить HTTPS использовать файл web.config
  • Пользовательский членствоProvider в .NET 4.0
  • System.Threading.Tasks - ограничение количества одновременных задач
  • Очередь запросов сеанса ASP.net
  • Настройка перенаправления в файле web.config
  • Как выбрать несколько файлов с помощью элемента управления загрузкой файлов?
  • Почта недоступна. Ответ сервера: 5.7.1 Не удалось передать для [email protected]
  • Как получить доступ к вашему сайту через LAN в ASP.NET
  • Давайте будем гением компьютера.