为什么对Server.MapPath()的任何引用都会杀死我的HttpContext Request.Params []?

时间:2016-08-06 20:52:12

标签: c# ajax asp.net-ajax httpcontext

我是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()。这是一个可行的或推荐的解决方案吗?

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文件。

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