Umbraco 7 - Global.asax - Application_Error

时间:2014-07-27 06:33:18

标签: umbraco global-asax umbraco7

我正在尝试编写自己的" Application_Error"对于我的网站。

我需要抓住404(以了解用户正在犯的错误)& 500以解决我的编程错误。在我开始在global.asax中使用Umbraco之前,我在我的网站上成功完成了这项工作。

我尝试了以下方法。

1:我创建了一个MyGlobal类(App_Code目录中的文件MyGlobal.vb:

  Public Class MyGlobal
     Inherits umbraco.Web.UmbracoApplication
    Protected Overloads Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim ctx As HttpContext = HttpContext.Current
         ctx.Response.Redirect("http://wwww.google.com")
    End Sub
End Class

很明显,这只是为了测试。

另外,我编辑了我的Global.asax文件,现在它看起来像这样:

<%@ Application Language="VB"   Inherits="MyGlobal" %>

<script runat="server">

</script>

我已经拥有:

<customErrors mode="Off" />

&安培;

<httpErrors existingResponse="PassThrough"/>

在我的web.config中。

1:当我尝试输入不存在的页面时,我会收到Umbraco 404错误页面。

2:当我故意创建500错误时,系统会向我显示错误页面,但不会重定向到Google。

请帮助,因为没有这个我不能活着。

感谢。

号Yoni

编辑: 当我在VB工作时,我使用了这个:

Imports Microsoft.VisualBasic
Imports Umbraco.Core


Public Class MyCustomEvent1
Inherits ApplicationEventHandler
Protected Overrides Sub ApplicationStarted(umbracoApplication As UmbracoApplicationBase, applicationContext As ApplicationContext)

    AddHandler umbracoApplication.[Error], AddressOf umbracoApplication_Error



End Sub

Private Sub umbracoApplication_Error(sender As Object, e As EventArgs)
    Dim x As HttpContext = HttpContext.Current
    x.Response.Redirect("http://www.espn.com")
    ' Do your stuff
End Sub

结束班

当我尝试404或500错误时,它不会触发。

(如果我在上部放置了一个重定向,我得到一个错误,&#34; System.Web.HttpException:响应在此上下文中不可用。&#34;)

你能帮忙吗? 感谢

1 个答案:

答案 0 :(得分:0)

关于404,您应该查看包301 URL Tracker。这是一个惊人的免费套餐跟踪所有404。在执行此操作时,它还会跟踪节点的所有重命名,当重命名节点时,它还会创建到新URL的重定向。对于cource,您还可以使用以前网站的网址或使用正则表达式创建自己的重定向。

使用Umbraco时,编写自己的全局asax并不是最佳做法,因为umbraco在启动时会使用很多东西。相反,您可以挂钩ApplicationEventHandler事件以在启动时注册自定义代码。激活处理程序的唯一方法是实现ApplicationEventHandler类。从umbraco启动调用从此类派生的所有类。

UmbracoApplicationBase类派生自HttpApplication。您可以挂钩此类的Error事件来实现自己的错误处理程序逻辑。

public class MyCustomEvent1 : ApplicationEventHandler
{
  protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
  {
    umbracoApplication.Error += umbracoApplication_Error;

    // very bad example
    // Response.Redirect("http://google.com")

  }

  void umbracoApplication_Error(object sender, EventArgs e)
  {
      // Do your stuff
  }
}

修改 如果您需要创建自己的&#34; 404未找到&#34;管道你应该创建一个IContentFindersee documentation)。以下示例来自此PDF:http://www.zpqrtbnk.net/CoreInternalsForWebsiteDevelopment.pdf和此session from Stéphane Gay presented at Codegarden

public class My404ContentFinder : IContentFinder 
{
  public bool TryFindContent(PublishedContentRequest contentRequest)
  {
    if (!contentRequest.HasDomain)
        return false;
    var contentCache = contentRequest.RoutingContext.UmbracoContext.ContentCache;
    var domainRoot = contentCache.GetById(contentRequest.Domain.RootNodeId);
    var firstSegment = contentRequest.Uri.AbsolutePath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).First();
    var root = domainRoot.Children.FirstOrDefault(x => x.UrlName == firstSegment);
    root = root ?? domainRoot.Children.First();
    var page = root.Descendants().FirstOrDefault(x => x.Name == "404");
    if (page == null) return false;
    contentRequest.PublishedContent = page;
    var wcd = Domain.GetDomainsById(root.Id, true).SingleOrDefault(x => x.IsWildcard);
   if (wcd != null) contentRequest.Culture = new CultureInfo(wcd.Language.CultureAlias);
    return true;
  }
}