【问题标题】:How to capture the url of the page that threw an exception如何捕获引发异常的页面的url
【发布时间】:2012-11-20 15:31:02
【问题描述】:

抓取当前 URL 很简单
HttpContext.Current.Request.Url.ToString();

事实上,这是this very similar question. 的公认答案 但是,我已经实现了应用程序范围的错误处理,并且有一个 ErrorController 可以在出现未处理的异常时生成电子邮件,这些电子邮件会发送回给我们。如果我在错误控制器中实现上面的代码 sn-p,我得到的 URL 类似于

http://.../Error/GenericError?aspxerrorpath=/Controller/ErrorProneAction

如何获取实际引发错误的页面的 url?也就是说,更像是

http://.../Controller/ErrorProneAction

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    根据您的评论 - 您的 global.asax 中是否有类似 void Application_OnError(object sender, EventArgs e) 的功能?如果是这样,那么您应该能够获得您正在寻找的信息。

    protected void Application_OnError(object sender, EventArgs e)
    {
        var app = (MvcApplication)sender;
        var context = app.Context;
        string path = context.Request.PathWithQueryString;
        ...
    

    给你类似/controllerOrRoute/action?query=val的东西。或者,您可以使用 RawUrl 或 Url 属性来获得基本相同的内容。我刚刚启动了我的应用程序以查看它生成的内容,看起来这就是您所要求的。

    编辑:我应该注意我为 MVC3 测试了上述内容。

    【讨论】:

    • 谢谢,我确实有你在Global中提到的方法,我也在使用mvc3。但是,如果我添加您发布的代码,我如何访问正确的网址?我仍然在控制器中使用 Request.Url 获得我在 OP 中提到的结果,好像什么都没有改变。
    • @Forty-Two 嗯,这真是太糟糕了。如果它在任何地方,我猜它肯定在上下文对象中。但如果你找不到它,它可能不存在:(
    • 猜猜我真的不明白如何使用 ApplicationState 对象。定义 Application["Path"] = path 后,此解决方案适用于我。谢谢,如果我有时有点笨拙,我深表歉意;)
    【解决方案2】:

    查看这篇博文:

    http://blog.gauffin.org/2011/11/how-to-handle-errors-in-asp-net-mvc/

    如果您将参数传递给您的ActionResult,这将采用aspxerrorpath 查询字符串值的值。

    public ActionResult NotFound(string url)
    {
      var originalUri = url ?? Request.QueryString["aspxerrorpath"] ?? Request.Url.OriginalString;
    }
    

    【讨论】:

    • 感谢您的回复。传入 url 不起作用,因为由于某种原因它始终为 null。您链接到的博客文章使用 [HandleError] 属性,而我没有。我在 Global.asax 中有一个应用程序错误方法。也许这就是这里的区别。我确实喜欢 Request.QueryString 调用。这实际上可能就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2014-10-07
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多