【问题标题】:Why are IHttpHandler Request.Params correct on first call, but NULL on second call?为什么 IHttpHandler Request.Params 在第一次调用时正确,但在第二次调用时为 NULL?
【发布时间】:2016-12-08 08:45:40
【问题描述】:

我有一个 HTML/Javascript 页面正在对 .NET ajax 处理程序 (.ASHX) 进行 jQuery ajax 调用。在第一次调用时,我在数据对象中传递的参数存在且正确。但在随后的调用中,它们为 NULL。

JavaScript 设置:

var data = {

    requestType: "RecentMXMeetings",
    meetingType: "Maintenance",
    baseDate: "6/15/2016",
    daysPast: 90, 
    daysFuture: 30
}

$.ajax({

    type: "GET", 
    url: "ajaxHandler.ashx",
    dataType: "text",
    cache: false,
    data: data,

    success: function (result) {
        alert("Success: " + result.responseText);
    },

    error: function (result) {
        alert("Error: " + result.responseText);
    },

    fail: function (result) {
        alert("Error - Fail: " + result.responseText);
    },

    always: function (result) {
        alert("Always: " + result.responseText);
    }

});

处理程序代码(.ashx):

public class ajaxHandler : IHttpHandler {

    public void ProcessRequest(HttpContext context) {

        string retJSON = "NODATA";

        var x = context.Request.Params["requestType"];


        if (!String.IsNullOrEmpty(x)) {

            switch (x) {

                case "RecentMXMeetings":
                    retJSON = SerialiseRecentMeetings(context);
                    break;

                    // other cases...

            }
        }

        context.Response.ContentType = "text/plain";
        context.Response.Write(retJSON);
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

    //
    // SerialiseRecentMeetings() and other methods...
    //

}

我在“var x = context....”上添加了一个断点。在第一次运行时,x == "RecentMXMeetings"。在第二次和后续运行中,x == null。

这是我在调试时能够确定的:

如果我把ajax类型从“GET”改成“POST”再运行,再改回“GET”再运行一次,数据对象参数一次正确返回,然后后续调用再次为空。在“GET”和“POST”之间来回切换可以解决一个呼叫的问题。

问题是间歇性的。有时运行四五次后,x 会返回“RecentMXMeetings”,然后再次返回 null。

在运行之间等待一段时间有时会“重置”它,这对运行有好处。然后再次返回为空。

这是我第一次涉足 C# 中的 ajax 处理程序,所以我是这方面的新手。

这是缓存问题吗?这里有异步问题吗?我可能没有正确使用或处理 HttpHandler 吗?

【问题讨论】:

  • 你能用POST代替GET吗?
  • 尝试使用 fiddler 查看您的网络流量,看看 HttpHandler 是否真的每次都在获取查询字符串。

标签: javascript c# jquery ajax httphandler


【解决方案1】:

事实证明,我的问题本身与代码本身无关,而与我运行项目的方式有关。

Visual Studio,当您单击“开始调试”按钮时,将在其根文档(即 index.html)处启动解决方案。除非当前打开的文档是可运行的类型,例如 .html。如果您当前打开的窗口是您的类文件之一(即 .cs),它不会尝试运行该类文件,但会在您的根文档中启动调试会话。

但是,如果这是您当前打开的文档,它将尝试自行运行一个通用处理程序 (.ashx)。而且,通过这样做,它不是从 index.html 页面开始,它发出我的 ajax 调用并将参数发送到处理程序。所以,我的 Params 集合是空的,因为它实际上是空的。单独运行 .ashx 不提供任何参数。

因此,将调用类型从 GET 更改为 POST 并再次返回 GET 后它起作用的原因是,在这样做时,我打开了 index.html 文件进行更改,当我再次启动调试会话时,我当前的文档是 index.html 文件,而不是 Generic Handler .ashx 文件。

我可能会因为犯了这个愚蠢的错误而失去一百点声望。但万一它对别人有帮助,它就在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多