为什么 IHttpHandler Request.Params 在第一次调用时正确,但在第二次调用时为 NULL?
Why are IHttpHandler Request.Params correct on first call, but NULL on second call?
我有一个 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"。在第二个和子序列 运行s 上,x == null.
以下是我在调试过程中能够确定的内容:
如果我将 ajax 类型从 "GET" 更改为 "POST" 和 运行,然后将其更改回 "GET" 和 运行 又一次,数据对象参数正确返回了一次,然后后面的调用又是NULL。在 "GET" 和 "POST" 之间来回切换修复了一次调用的问题。
问题是间歇性的。有时四五个运行之后,x会回来"RecentMXMeetings",然后又回到null。
在 运行 之间等待一段时间有时会 "reset" 它会很好 运行。然后再回到 null。
这是我第一次接触 ajax C# 处理程序,所以我在这方面是个新手。
这是缓存问题吗?这里有异步问题吗?我可能没有正确使用或处理 HttpHandler 吗?
事实证明,我的问题本身与代码本身无关,而是我如何 运行 启动项目。
Visual Studio,当您单击 "Start Debug" 按钮时,将在其根文档(即 index.html)处启动解决方案。也就是说,除非当前打开的文档是 运行 可用类型,例如 .html。如果您当前打开的 window 是您的 class 文件之一(即 .cs),它不会尝试 运行 class 文件,但会启动调试会话在您的根文档中。
但是,它会尝试 运行 一个通用处理程序 (.ashx),如果它是您当前打开的文档的话。而且,通过这样做,它不是从发出我的 ajax 调用并将参数发送到处理程序的 index.html 页面开始的。所以,我的 Params 集合是空的,因为它实际上是空的。 运行 .ashx 本身不提供任何参数。
所以,在将我的调用类型从 GET 更改为 POST 并再次返回 GET 后它起作用的原因是,在这样做时,我打开了 index.html 文件来进行更改,并且当我再次开始调试会话时,我当前的文档是 index.html 文件,而不是通用处理程序 .ashx 文件。
我可能会因为犯这个愚蠢的错误而失去一百点声誉。但如果它能帮助别人,那就是它。
我有一个 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"。在第二个和子序列 运行s 上,x == null.
以下是我在调试过程中能够确定的内容:
如果我将 ajax 类型从 "GET" 更改为 "POST" 和 运行,然后将其更改回 "GET" 和 运行 又一次,数据对象参数正确返回了一次,然后后面的调用又是NULL。在 "GET" 和 "POST" 之间来回切换修复了一次调用的问题。
问题是间歇性的。有时四五个运行之后,x会回来"RecentMXMeetings",然后又回到null。
在 运行 之间等待一段时间有时会 "reset" 它会很好 运行。然后再回到 null。
这是我第一次接触 ajax C# 处理程序,所以我在这方面是个新手。
这是缓存问题吗?这里有异步问题吗?我可能没有正确使用或处理 HttpHandler 吗?
事实证明,我的问题本身与代码本身无关,而是我如何 运行 启动项目。
Visual Studio,当您单击 "Start Debug" 按钮时,将在其根文档(即 index.html)处启动解决方案。也就是说,除非当前打开的文档是 运行 可用类型,例如 .html。如果您当前打开的 window 是您的 class 文件之一(即 .cs),它不会尝试 运行 class 文件,但会启动调试会话在您的根文档中。
但是,它会尝试 运行 一个通用处理程序 (.ashx),如果它是您当前打开的文档的话。而且,通过这样做,它不是从发出我的 ajax 调用并将参数发送到处理程序的 index.html 页面开始的。所以,我的 Params 集合是空的,因为它实际上是空的。 运行 .ashx 本身不提供任何参数。
所以,在将我的调用类型从 GET 更改为 POST 并再次返回 GET 后它起作用的原因是,在这样做时,我打开了 index.html 文件来进行更改,并且当我再次开始调试会话时,我当前的文档是 index.html 文件,而不是通用处理程序 .ashx 文件。
我可能会因为犯这个愚蠢的错误而失去一百点声誉。但如果它能帮助别人,那就是它。