为什么IHttpHandler Request.Params在第一次调用时是正确的,但在第二次调用时是NULL?

时间:2016-08-02 20:27:34

标签: javascript c# jquery ajax httphandler

我有一个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”并再次运行,数据对象参数将正确返回一次,然后后续调用再次为NULL。在“GET”和“POST”之间来回切换可以解决一个呼叫的问题。

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

在两次运行之间等待一段时间有时会“重置”它,这对于那次运行会有好处。然后再回到null。

这是我第一次尝试使用C#中的ajax处理程序,所以我非常喜欢这个。

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

1 个答案:

答案 0 :(得分:0)

事实证明我的问题本身与代码本身无关,而是我如何运行该项目。

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

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

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

我可能会因为犯这个愚蠢的错误而失去一百个声誉点。但是,如果它有助于其他人,那就是它。