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 в запросе.


person colin jobes    schedule 01.06.2010    source источник
comment
образец поможет вам stackoverflow.com/a/19824240/1153856   -  person OsmZnn    schedule 10.12.2013


Ответы (7)


Я знаю, что это слишком старо, но для записи я хотел бы добавить свои 5 центов

Вы можете прочитать объект JSON на сервере с помощью этого

string json = new StreamReader(context.Request.InputStream).ReadToEnd();
person Claudio Redi    schedule 03.01.2012
comment
это самые важные 5 центов. Я хотел бы добавить к этому, если вы не возражаете. - person naveen; 18.09.2012
comment
@Claudio Redi Помогите мне решить эту проблему ... stackoverflow.com/questions/24732952/ - person Sagotharan; 14.07.2014
comment
Это просто добавляет JSON к строковой переменной. Как бы вы смогли проанализировать данные в этой строке? Что, если это объект, содержащий массив объектов? - person Coded Container; 03.07.2017
comment
@CodedContainer этот вопрос не касается этого ... Но вам нужно десериализовать строку. См. Эту stackoverflow.com/questions / 10350982 / - person tno2007; 08.11.2017

У меня сработало следующее решение:

Сторона клиента:

        $.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;
           }
        }
    }
person Andre    schedule 08.07.2011
comment
У меня так не получилось, а скорее: string myName = context.Request["firstName"]; - person Jaanus; 01.08.2013
comment
@Jaanus Вы используете POST? - person Andre; 12.09.2013
comment
@Andre, могу ли я получить полную строку {firstName: 'stack', lastName: 'overflow'}. Мне не нужно расщепляться. Пожалуйста, дайте решение stackoverflow.com/questions/24732952/ - person Sagotharan; 14.07.2014

Если вы отправляете данные на сервер в отношении $.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 на стороне сервера.

person Oleg    schedule 01.06.2010
comment
Спасибо за ответ. Проблема, с которой я столкнулся, заключается в том, что я не могу получить данные JSON в объекте запроса при использовании страницы ASHX. Значение context.Request.QueryString [file] всегда равно нулю. Вы бы знали, как вставить данные JSON в запрос? - person colin jobes; 01.06.2010
comment
Чтобы иметь возможность видеть параметр file с context.Request.QueryString["file"], вы должны использовать data как data: {file:'dave', type:'ward'} (см. Мой ответ). Затем будут определены параметры запроса с именами file и type, а данные, отправленные на сервер, будут закодированы как file=dave?type=ward. - person Oleg; 01.06.2010
comment
Если ваш AJAX является POSTing, то данные будут в свойстве Request.Form, а не в QueryString. - person Dave Thieben; 21.09.2010
comment
@dave thieben: Вы правы. Спасибо за совет. Сам я не использую ASHX. Так что вместо Request.QueryString было бы лучше Request.Form. Мне кажется, что Request.Params - лучший способ, потому что он будет работать как для GET, так и для POST (см. msdn.microsoft.com/en-us/library/) - person Oleg; 21.09.2010

Это работает для вызова веб-сервисов. Не уверен насчет .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";
}
person Larry Flewwelling    schedule 20.09.2010

вы должны определить свойства обработчика в файле веб-конфигурации для обработки пользовательских форматов запроса расширения. здесь пользовательское расширение - ".api"

add verb = "*" path = "test.api" type = "test" замените url: "/test.ashx" на url: "/ test.api ".

person Ashish Sharma    schedule 21.09.2010

при использовании $ .ajax и использовании .ashx для получения строки запроса не устанавливайте тип данных

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

я получаю это работает!

person user411861    schedule 05.08.2010

Попробуйте System.Web.Script.Serialization.JavaScriptSerializer

С приведением к словарю

person Dewfy    schedule 01.06.2010
comment
Спасибо за ответ. Не могли бы вы немного уточнить? Какой объект я должен сериализовать? - person colin jobes; 01.06.2010
comment
@colin, я предпочитаю Dictionary, но вы можете сохранить любой объект, например, в вашем примере: class MyObj {public String file, type; } - person Dewfy; 01.06.2010