以来 AC建议我发布一些示例代码 对于我在WCM技巧5大提示中提出的一些观点,我现在已经做到了。在代码中,您可以找到以下示例:
- 异常处理程序HTTP模块 -当发生未处理的异常时发送通知电子邮件,并将用户重定向到可配置的“友好”错误页面
- 母版页的自定义基类 -这几乎是一个骨架类,因为您的实现会有所不同,但演示了如何使用自定义基类
- 跟踪助手类和匹配的ReSharper模板 -记录代码中发生的情况(这是一个奖励,因为我建议这些类实现跟踪!)
这些文件可以从以下位置的Visual Studio项目中下载:
http://sharepointchris.googlepages.com/wcmsamplecode
但是对于那些只想快速看一下代码的人,请参见下文。 项目中的实际类具有注释,以帮助您“使用”网站中的这些内容-为了便于阅读,以下内容已将其删除:
异常处理程序HTTP模块代码:
using System;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using COB.SharePoint.Utilities;
namespace COB.Demos.WcmSamples
{
public class ExceptionHandlerHttpModule : IHttpModule
{
#region -- Private members --
private TraceSwitch traceSwitch = new TraceSwitch("COB.Demos.WcmSamples.ExceptionHandlerHttpModule",
"Trace switch for the COB.Demos.WcmSamples.ExceptionHandlerHttpModule.");
private TraceHelper trace = null;
#endregion
#region -- Constructor
public ExceptionHandlerHttpModule()
{
trace = new TraceHelper(this);
}
#endregion
public void Init(HttpApplication context)
{
context.Error += context_Error;
}
private void context_Error(Object sender, EventArgs e)
{
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "context_Error(): Entered error-handling module.");
// collect the last error..
var exception = HttpContext.Current.Server.GetLastError();
// process it/send e-mail..
processError(exception);
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "context_Error(): Finished handling error, " +
"about to redirect.");
// and finally clear the error and redirect to the friendly error page..
HttpContext.Current.Server.ClearError();
HttpContext.Current.Response.Clear();
string sErrorUrl = ConfigStore.GetValue("Errors", "FriendlyErrorPageUrl");
HttpContext.Current.Response.Redirect(sErrorUrl);
}
private void processError(Exception exception)
{
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "processError(): Entered.");
string sMessage = buildEmailText(exception);
trace.WriteLineIf(traceSwitch.TraceInfo, TraceLevel.Info, "processError(): Built error string '{0}', calling SendEmail.",
sMessage);
sendEmail(sMessage);
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "processError(): Leaving.");
}
private static string buildEmailText(Exception exception)
{
var messageBuilder = new StringBuilder();
messageBuilder.AppendLine("<strong>Date: </strong>" + DateTime.Now);
messageBuilder.AppendLine("<br /><strong>Message: </strong>" + exception.Message);
messageBuilder.AppendLine("<br /><strong>Source: </strong>" + exception.Source);
messageBuilder.AppendLine("<br /><strong>Current user: </strong>" + Thread.CurrentPrincipal.Identity.Name);
messageBuilder.AppendLine("<br /><strong>Machine name: </strong>" + Environment.MachineName);
messageBuilder.AppendLine("<br /><strong>Url: </strong>" + HttpContext.Current.Request.RawUrl);
messageBuilder.AppendLine("<br /><br /><strong>Exception details: </strong>" + exception);
return messageBuilder.ToString();
}
private void sendEmail(String message)
{
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "sendEmail(): Entered.");
try
{
var errorToAddress = ConfigStore.GetValue("Errors", "SendToEmail");
var sErrorSubject = ConfigStore.GetValue("Errors", "EmailSubject");
trace.WriteLineIf(traceSwitch.TraceInfo, TraceLevel.Info,
String.Format("SendEmail(): About to send error e-mail to recipient list '{0}' using SPUtility.SendEmail().",
errorToAddress));
SPUtility.SendEmail(SPContext.Current.Web, false, false, errorToAddress, sErrorSubject, message);
}
catch (Exception exception)
{
var traceMessage = String.Format("Exception thrown 在 tempting to send error e-mail using SPUtility.SendEmail(). " +
"Exception Details: {0}", exception);
trace.WriteLineIf(traceSwitch.TraceError, TraceLevel.Error, String.Format("sendEmail(): {0}", traceMessage));
}
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "sendEmail(): Leaving.");
}
public void Dispose()
{
// nothing to do here..
}
}
}
母版页的骨架基类:
using System;
using System.Diagnostics;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;
namespace COB.Demos.WcmSamples
{
public class BasePage : MasterPage
{
#region -- Private members --
private TraceSwitch traceSwitch = new TraceSwitch("COB.Demos.WcmSamples.BasePage",
"Trace switch for the base page class.");
private TraceHelper trace = null;
#endregion
public BasePage()
{
trace = new TraceHelper(this);
}
protected override void OnLoad(EventArgs e)
{
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "OnLoad(): Entered.");
// TODO: add custom code here..
base.OnLoad(e);
trace.WriteLineIf(traceSwitch.TraceVerbose, TraceLevel.Verbose, "OnLoad(): Leaving.");
}
/// <summary>
/// Showing an example base page property..
/// </summary>
public bool UserIsAuthenticated
{
get { return HttpContext.Current.User.Identity.IsAuthenticated; }
}
}
}
2条评论:
我喜欢这个。
您是否知道可以使用SPWebConfigModification和app.Farm.Services.GetValue ... SPWebService ...()。ApplyWebConfigModifications()首先添加httpmodule吗?
我们不允许使用记事本弄乱web.config,因此所有更改都必须通过代码来完成(拥有2个前端,1个CA和一个索引的农场)...;(
尼克拉斯
我非常确定您可以使用SPWebConfigModification定位web.config中的任何内容,因为您为希望添加/修改的元素提供了XPath。
所以是的,应该是可能的:-)
克里斯。
发表评论