为什么对 Server.MapPath() 的任何引用都会终止我的 HttpContext Request.Params[]?
Why does any reference to Server.MapPath() kill my HttpContext Request.Params[]?
我是 HttpHandlers 的新手。这实际上是我的第一次尝试。
我有这个 Ajax 处理程序来响应我的网络应用程序前端中的 jQuery ajax 调用:
public class ajaxMeetingHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
string resultsJSON = "";
string requestType = context.Request.Params["requestType"];
if (!String.IsNullOrEmpty(requestType)) {
switch (requestType) {
case "RecentMXMeetings":
resultsJSON = SerialiseRecentMeetings(context, "Maintenance");
// SerialiseRecentMeetings() is a method in the class
// that works fine and is not included for brevity.
break;
// more cases (not included for brevity)
}
}
public bool IsReusable {
get {
return false;
}
}
}
}
这非常有效。
但是,如果我在代码中的任意位置添加这两个语句中的任何一个:
var x = context.Server.MapPath("/");
var y = HttpContext.Current.Server.MapPath("/");
...我的 Context.Request.Params[]
集合变为空,IsNullOrEmpty(requestType)
现在将 requestType
视为空。事实上,所有 Request.Params[]
都是空的。
如果我注释掉这些语句(并完全重建解决方案),事情就会恢复正常。
与此同时,我将把对 MapPath() 的调用移到静态 "RunTimeEnvironment" class 这样我就可以从那里获得我需要的路径,而无需从在这个 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 文件。
我可能会因为犯这个愚蠢的错误而失去一百点声誉。但如果它能帮助别人,那就是它。
我是 HttpHandlers 的新手。这实际上是我的第一次尝试。
我有这个 Ajax 处理程序来响应我的网络应用程序前端中的 jQuery ajax 调用:
public class ajaxMeetingHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
string resultsJSON = "";
string requestType = context.Request.Params["requestType"];
if (!String.IsNullOrEmpty(requestType)) {
switch (requestType) {
case "RecentMXMeetings":
resultsJSON = SerialiseRecentMeetings(context, "Maintenance");
// SerialiseRecentMeetings() is a method in the class
// that works fine and is not included for brevity.
break;
// more cases (not included for brevity)
}
}
public bool IsReusable {
get {
return false;
}
}
}
}
这非常有效。
但是,如果我在代码中的任意位置添加这两个语句中的任何一个:
var x = context.Server.MapPath("/");
var y = HttpContext.Current.Server.MapPath("/");
...我的 Context.Request.Params[]
集合变为空,IsNullOrEmpty(requestType)
现在将 requestType
视为空。事实上,所有 Request.Params[]
都是空的。
如果我注释掉这些语句(并完全重建解决方案),事情就会恢复正常。
与此同时,我将把对 MapPath() 的调用移到静态 "RunTimeEnvironment" class 这样我就可以从那里获得我需要的路径,而无需从在这个 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 文件。
我可能会因为犯这个愚蠢的错误而失去一百点声誉。但如果它能帮助别人,那就是它。