这个跟以前~~介绍过的
Web设置 类似,只是这里的Web设置更好点- -先看下web.config片断
<
configuration
xmlns
="http://schemas.microsoft.com/.NetConfiguration/v2.0"
>
<
configSections
>
<
section
name
="theBeerHouse"
type
="MB.TheBeerHouse.TheBeerHouseSection, __code"
/>
</
configSections
>
<
theBeerHouse
defaultConnectionStringName
="LocalSqlServer"
>
<
contactForm
mailTo
="thebeerhouse@wrox.com"
/>
<!--
默认显示商品的数量
-->
<
articles
pageSize
="10"
/>
<
polls
archiveIsPublic
="true"
votingLockByIP
="false"
/>
<
newsletters
fromEmail
="thebeerhouse@wrox.com"
fromDisplayName
="TheBeerHouse"
/>
<
forums
threadsPageSize
="8"
hotThreadPosts
="10"
bronzePosterPosts
="10"
silverPosterPosts
="20"
goldPosterPosts
="50"
/>
<
store
sandboxMode
="true"
businessEmail
="thebeerhouse@wrox.com"
/>
</
theBeerHouse
>
开始- -分析首先是 <section name="theBeerHouse" type="MB.TheBeerHouse.TheBeerHouseSection, __code"/>
Web设置 讲过了~~就是对应一个类.
<theBeerHouse defaultConnectionStringName="LocalSqlServer">.....</theBeerHouse>这个是跟上面name对应的节点
Web设置也有详细说明~~不废话~~首先看看类图然后再分析下哪里不同咯
说明下:凡是有对应类的属性都是嵌套节点哦
让我来看看TheBeerHouseSection类的定义- -注意看~~有注释懒得打了~~
TheBeerHouseSection

/**//// <summary>
/// 配置节点管理类
/// </summary>
public class TheBeerHouseSection : ConfigurationSection

{

/**//// <summary>
/// 默认的连接对象
/// </summary>
[ConfigurationProperty("defaultConnectionStringName", DefaultValue = "LocalSqlServer")]
public string DefaultConnectionStringName

{

get
{ return (string)base["defaultConnectionStringName"]; }

set
{ base["connectionStdefaultConnectionStringNameringName"] = value; }
}


/**//// <summary>
/// 默认的换冲对象
/// </summary>
[ConfigurationProperty("defaultCacheDuration", DefaultValue = "600")]
public int DefaultCacheDuration

{

get
{ return (int)base["defaultCacheDuration"]; }

set
{ base["defaultCacheDuration"] = value; }
}

/**//// <summary>
/// 接点-主要配置电子邮件
/// </summary>
[ConfigurationProperty("contactForm", IsRequired=true)]
public ContactFormElement ContactForm

{

get
{ return (ContactFormElement) base["contactForm"]; }
}

/**//// <summary>
/// 节点主要配置显示上商品的页面默认,显示几个商品
/// </summary>
[ConfigurationProperty("articles", IsRequired = true)]
public ArticlesElement Articles

{

get
{ return (ArticlesElement)base["articles"]; }
}

[ConfigurationProperty("polls", IsRequired = true)]
public PollsElement Polls

{

get
{ return (PollsElement)base["polls"]; }
}

[ConfigurationProperty("newsletters", IsRequired = true)]
public NewslettersElement Newsletters

{

get
{ return (NewslettersElement)base["newsletters"]; }
}

[ConfigurationProperty("forums", IsRequired = true)]
public ForumsElement Forums

{

get
{ return (ForumsElement)base["forums"]; }
}

[ConfigurationProperty("store", IsRequired = true)]
public StoreElement Store

{

get
{ return (StoreElement)base["store"]; }
}


/**//// <summary>
/// 网战配置程序
/// </summary>
[ConfigurationProperty("pageProvider", IsRequired = true)]
public PageElement PageProvider

{

get
{ return (PageElement)base["pageProvider"]; }
}



}
其他的部分,只写一个~~不占用版面了~~~
/**/
/// <summary>
/// 配置电子邮件
/// </summary>
public
class
ContactFormElement : ConfigurationElement

{
[ConfigurationProperty("mailSubject", DefaultValue="Mail from TheBeerHouse: {0}")]
public string MailSubject

{

get
{ return (string)base["mailSubject"]; }

set
{ base["mailSubject"] = value; }
}

[ConfigurationProperty("mailTo", IsRequired=true)]
public string MailTo

{

get
{ return (string)base["mailTo"]; }

set
{ base["mailTo"] = value; }
}

[ConfigurationProperty("mailCC")]
public string MailCC

{

get
{ return (string)base["mailCC"]; }

set
{ base["mailCC"] = value; }
}
}
Ok--这就是主要的节点结构.让我们继续往下走:
<
authentication
mode
="Forms"
>
<
forms
cookieless
="AutoDetect"
loginUrl
="~/AccessDenied.aspx"
name
="TBHFORMAUTH"
/>
</
authentication
>
上面这段代码有意思,他的作用是结合权限验证的如果没有经过权限验证则定位到某某页,其实我更倾向于下面这样写利用HttpHandler来自动捕捉
public
class
Bt : IHttpHandlerFactory

{//其实就是HttpHandler{
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)

{



string sendToUrl = url; //地址栏里面的地址
System.Collections.Generic.List<string> UrlSqlit = new System.Collections.Generic.List<string>();
UrlSqlit.AddRange(url.Split('/'));

string filePath = pathTranslated;

string sendToURLString;


if(UrlSqlit[UrlSqlit.Count-1]=="Admin.aspx")

{
if(Page.User.Identity.IsAuthenticated&&Roles.IsUserInRole(Page.User.Identity,"Admin")

{
sendToURLString= "~/Admin.aspx"; //真正要访问的页面
}else

{
sendToURLString="~/AccessDenied.aspx";
}
}




string queryString =""; //参数。比如?id=123


//这句最重要了。转向了。
context.RewritePath(sendToURLString, String.Empty, queryString);

//这个还没有弄明白:)---返回新的编译实例
return PageParser.GetCompiledPageInstance(url, filePath, context);
}
//---------------------------------使工厂可以重用现有的处理程序实例。
public virtual void ReleaseHandler(IHttpHandler handler)

{
}



}
这是配置~文件
>
<
httpHandlers
>
<!--
verb是处理的请求类型*是所有,GET,POST, PATH=处理的类型,typehttpHandLers
-->
<
add
verb
="*"
path
="*.aspx"
type
="Bt"
/>
</
httpHandlers
>
---跑题了我们继续-说说Web事件~`首先看个类
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.Web.Management;

namespace
MB.TheBeerHouse

{
public abstract class WebCustomEvent : WebBaseEvent

{

/**//// <summary>
/// </summary>
/// <param name="message">引发的事件的说明。</param>
/// <param name="eventSource">引发事件的对象。</param>
/// <param name="eventCode">与该事件关联的代码。实现自定义事件时,事件代码必须大于WebExtendedBase。</param>
public WebCustomEvent(string message, object eventSource, int eventCode)

: base(message, eventSource, eventCode)
{ }
}

public class RecordDeletedEvent : WebCustomEvent

{
private const int eventCode = WebEventCodes.WebExtendedBase + 10;//自定义WebEventCodes.WebExtendedBase事件必须大于
private const string message = "The {0} with ID = {1} was deleted by user {2}.";//这里做的好动静结合太极拳的味道

public RecordDeletedEvent(string entity, int id, object eventSource)//HttpContext.Current.User.Identity.Name获取当前用户的名称
: base(string.Format(message, entity, id, HttpContext.Current.User.Identity.Name), eventSource, eventCode)

{ }
}
}
--接下来就是配置~~都有注释的慢慢看~~
<
healthMonitoring
heartbeatInterval
="10800"
>
//针对运行状况监视配置应用程序,必选的 TimeSpan 属性。

//heartbeatInterval指定时间间隔,即引发 WebHeartbeatEvent 事件的频率(以秒为单位)。 默认值为 "00:00:00",它表示不引发 WebHeartbeatEvent 事件。
<
providers
>
<
remove
name
="SqlWebEventProvider"
/>
<
add
name
="SqlWebEventProvider"
connectionStringName
="LocalSqlServer"
//buffer定义提供程序的缓冲功能。
buffer
="false"
bufferMode
="Notification"
maxEventDetailsLength
="1073741823"
//bufferMode定义提供程序的缓冲功能。
type
="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
/>
</
providers
>
<
eventMappings
>
//可选的元素。将事件友好名称映射到相关的事件类型。

<
add
name
="TBH Events"
type
="MB.TheBeerHouse.WebCustomEvent, MB.TheBeerHouse.CustomEvents"
/>
</
eventMappings
>
<
rules
>
<
clear
/>
//就是可以触发检测的程序配置--SqlWebEventProvider这个是值得记录到Sql中--记录Window到日志中--EventLogWebEventProvider
<
add
name
="TBH Events"
eventName
="TBH Events"
provider
="SqlWebEventProvider"
profile
="Critical"
/>
<
add
name
="All Errors"
eventName
="All Errors"
provider
="SqlWebEventProvider"
profile
="Critical"
/>
<
add
name
="Failure Audits"
eventName
="Failure Audits"
provider
="SqlWebEventProvider"
profile
="Critical"
/>
<
add
name
="Heartbeats"
eventName
="Heartbeats"
provider
="SqlWebEventProvider"
profile
="Critical"
/>
</
rules
>
</
healthMonitoring
>
//--------------。与内置的 ASP.NET 运行状况监视事件不同的是,自定义事件必须显式引发。
要引发自定义事件必须
RecordDeletedEvent swre =new RecordDeletedEvent ("Heartbeats", this, myCode);//--参数1是eventName
// --运行这个引发自定义事件
swre.Raise();