ASP.NET - передача JSON из jQuery в ASHX - PullRequest
42 голосов
/ 01 июня 2010

Я пытаюсь передать 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 в запросе.

Ответы [ 8 ]

55 голосов
/ 03 января 2012

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

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

string json = new StreamReader(context.Request.InputStream).ReadToEnd();
24 голосов
/ 08 июля 2011

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

Клиентская сторона:

        $.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;
           }
        }
    }
4 голосов
/ 01 июня 2010

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

2 голосов
/ 12 сентября 2013
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; } }
}
1 голос
/ 21 сентября 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";
}
0 голосов
/ 21 сентября 2010

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

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

0 голосов
/ 05 августа 2010

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

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

у меня получилось!

0 голосов
/ 01 июня 2010

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

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

...