我正在尝试编写自己的" 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;)
你能帮忙吗? 感谢答案 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;管道你应该创建一个IContentFinder
(see 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;
}
}