mvc 使用 IHttpHandler,出现 500 错误

mvc using IHttpHandler, getting 500 error

我的应用程序的根目录中有以下处理程序 (.ashx) 文件:

    public class KeepSessionAlive : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        context.Session["KeepSessionAlive"] = DateTime.Now;
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

我已将以下内容添加到我的 RouteConfig.cs:

            routes.IgnoreRoute("KeepSessionAlive.ashx");

我还在 web.config 中添加了以下内容: 在 system.web -> httphandlers 下:

<add verb="*" path="/KeepSessionAlive.ashx" type="MyWeb.KeepSessionAlive" validate="false" />

和 system.web 服务器下 -> 处理程序

<add name="KeepSessionAlive" path="/*.ashx" verb="*" type="MyWeb.KeepSessionAlive" />

我一直遇到的问题是网站一直在页面所在的同一文件夹中而不是根目录中寻找处理程序。例如,如果我点击主页,在 Fiddler 中我会看到:

GET /MySite/KeepSessionAlive.ashx?c=678962070347 HTTP/1.1

其中 returns 200 并且有效。但是,如果我转到子文件夹页面,例如 /MySite/Payment/Edit,当我离开 Fiddler 中的编辑页面时,我会看到这个:

GET /EAOTracking/Payment/EditAM/KeepSessionAlive.ashx?c=776502292135 HTTP/1.1

然后 returns 出现 500 错误,其中指出: System.ArgumentException:参数字典包含 'MyWeb.Controllers.PaymentController' 中方法 'System.Web.Mvc.ActionResult Edit(Int32)' 的不可为空类型 'System.Int32' 的参数 'id' 的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:parameters

我的编辑动作定义如下:

public ActionResult Edit(int id)

我不确定为什么 Handler 并不总能在根文件夹中找到,因为如果我在站点的根文件夹中它就可以工作。

如果您需要在绝对位置调用页面 url - 使用绝对 url 就像

 "/KeepSessionAlive.ashx"

在页面上使用相对 url ("KeepSessionAlive.ashx")(我假设您使用 JavaScript 来 ping 处理程序)会将其与页面的基础 url 结合起来。