我是HttpHandlers的新手。这实际上是我第一次尝试。
我有这个Ajax处理程序,它在我的Web应用程序前端响应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”类,这样我就可以从那里得到我需要的路径,而不需要从这个HttpHandler中触及MapPath()。这是一个可行的或推荐的解决方案吗?
答案 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文件。
我可能会因为犯这个愚蠢的错误而失去一百个声誉点。但是,如果它有助于其他人,那就是它。