启用 WCF 中仪表化的 4 个步骤






4.52/5 (13投票s)
启用 WCF 中仪表化的 4 个步骤
目录
- 引言和目标
- 事件提供程序模型
- 本文将做什么?
- 步骤 1:创建主事件类
- 步骤 2:创建 WCF 服务并更改 web.config
- 步骤 3:在 ASPX 客户端中使用 WCF 服务
- 步骤 4:在事件查看器中查看审核数据
引言和目标
很多时候,我们希望在生产环境中监控 WCF 应用程序的事件。 我们希望监控错误、安全审核、性能等事件。 这可以通过扩展 WCF 中的 ASP.NET 运行状况监控系统来实现。 运行状况监控系统也称为检测。
事件提供程序模型
检测是使用事件提供程序模型提供的。 事件是您从 WCF 应用程序收到的通知,例如密码更改等安全事件、UI 点击事件或应用程序级错误等异常事件。 这些事件由提供程序捕获并路由到事件查看器、SQL Server 等某些源。

事件和提供程序都在 web.config 文件中指定。 eventMappings
元素用于指定您的提供程序,而 'rules' 元素帮助您将事件与提供程序关联起来。
<healthMonitoring>
<eventMappings>...</eventMappings>
<rules>...</rules>
</healthMonitoring>
本文将做什么?
在本文中,我们将创建一个简单的审核功能,该功能将帮助我们跟踪对 WCF 服务的所有调用,并将其记录到事件查看器中。 因此,WCF 客户端的任何调用都将被跟踪并在事件查看器中进行审核。 对于每个调用,我们将跟踪详细信息,例如线程数、工作集、应用程序域、消息的创建时间和引发时间。 下面是相同的代码片段,它将被跟踪在事件查看器中。
***************start health monitoring event*******************
message created at:Event Created at :3/14/2010 11:32:37 AM
message raised at:Event Created at :3/14/2010 11:32:37 AM
Heap size 3480664
Number of threads 19
Number of Working sets 32165888
Number of domains 1
Request rejected 0******************End Health Monitoring event*********************
步骤 1:创建主事件类
第一步是创建一个类,这将帮助我们跟踪对 WCF 服务的调用。 此类需要从 WebAuditEvent
类继承。 此类帮助我们跟踪审核事件,生成有关安全相关操作的信息,并提供成功和失败的审核事件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Management;
namespace healthmonitering
{
public class CustomAudit:WebAuditEvent
{
}
}
在同一个类中,让我们添加 3 个 private
字段:msgcreated
、msgraised
和 WebProcessStatistics
。 通过使用 msgcreated
和 msgraised
,我们可以跟踪事件的创建和引发时间。 WebProcessStatistics
将提供用于评估正在运行的进程的健康状况的信息。
private string msgcreated = string.Empty;
private string msgraised = string.Empty;
private static WebProcessStatistics processStatistics;
实现必要的 public
构造函数,这些构造函数调用父 WebAuditEvent
类中的受保护的等效项。 Base
关键字用于访问派生类中基类的成员,如以下代码片段所示。 请注意,我们已经创建了 WebProcessStatistics
对象并将其设置为 private
成员变量。
public CustomAudit(string message, object eventsource, int eventcode)
: base(message, eventsource, eventcode)
{
msgcreated = string.Format("Event Created at :{0}", EventTime.ToString());
processStatistics = new WebProcessStatistics();
}
在两个构造函数中,我们都在检查事件的创建时间。 现在重写 Raise
方法,如以下代码片段所示。
public override void Raise()
{
msgraised = string.Format("Event Created at :{0}", EventTime.ToString());
base.Raise();
}
使用我们要在事件查看器中记录的消息重写 FormatCustomEventDetails
方法。 请注意,我们使用了 WebProcessStatistics
获取堆大小、线程数、工作集数量、域数和请求拒绝等信息。
public override void FormatCustomEventDetails(WebEventFormatter formatter)
{
formatter.AppendLine("");
formatter.IndentationLevel += 1;
formatter.AppendLine
("***************start health monitoring event*******************");
formatter.AppendLine(string.Format("message created at:{0}",msgcreated));
formatter.AppendLine(string.Format("message raised at:{0}", msgraised));
formatter.AppendLine(string.Format
("Heap size {0}", processStatistics.ManagedHeapSize.ToString()));
formatter.AppendLine(string.Format
("Number of threads {0}", processStatistics.ThreadCount.ToString()));
formatter.AppendLine(string.Format
("Number of Working sets {0}", processStatistics.WorkingSet.ToString()));
formatter.AppendLine(string.Format
("Number of domains {0}", processStatistics.AppDomainCount.ToString()));
formatter.AppendLine(string.Format
("Request rejected {0}", processStatistics.RequestsRejected.ToString())); ;
formatter.AppendLine
("******************End Health Monitoring event*********************");
formatter.IndentationLevel -= 1;
}
在 Raise
方法中,我们正在检查事件的引发时间,在 FormatCustomEventDetails
中,我们将结果附加到审核事件中。
步骤 2:创建 WCF 服务并更改 web.config
namespace WcfService3
{
[ServiceContract]
public interface IService1
{
[OperationContract]
string Audit();
}
}
在 Audit
函数中,我们将实现我们的运行状况监控功能,该功能位于运行状况操作契约中。
在 Service1.svc.cs 类中,通过创建 CustomAudit
对象并调用 Raise
函数来实现 Audit
函数,如以下代码片段所示
public class Service1 : IService1
{
public string Audit()
{
Healthmonitering.CustomAudit webevent =
new Healthmonitering.CustomAudit("Some on called",
this, WebEventCodes.WebExtendedBase + 1);
webevent.Raise();
return "Event Audited";
}
}
在构造函数中,我们正在将消息、事件源和事件代码作为参数发送。
现在转到 web.config,并在 system.web 元素下添加 healthmonitoring
标签。 在 eventMappinga
元素中指定 CustomAudit
类,并在 rules
元素标签中将该类与事件查看器映射,如以下代码片段所示。
<healthMonitoring>
<eventMappings>
<add name="healthmonitering" type="Healthmonitering.CustomAudit "/>
</eventMappings>
<rules>
<add name="healthmonitering" eventName="healthmonitering"
provider="EventLogProvider" minInterval="00:00:01"/>
</rules>
</healthMonitoring>
步骤 3:在 ASPX 客户端中使用 WCF 服务
因此,让我们添加一个 ASPX 按钮,使用客户端服务并在按钮点击事件中调用 Audit
函数,如以下代码片段所示
<asp:Button ID="Button1" runat="server" Text="Invoke" onclick="Button1_Click" />
现在在按钮点击事件中,编写这些行
protected void Button1_Click(object sender, EventArgs e)
{
ServiceReference1.Service1Client proxy =
new WebApplication1.ServiceReference1.Service1Client();
string result = proxy.Audit();
Response.Write(result);
}
在这里,我们正在创建代理,调用 Audit
方法并显示 Audit
方法的结果。
步骤 4:在事件查看器中查看审核数据
运行正在使用 WCF 服务的 Web 应用程序,然后按按钮以调用 WCF 审核功能。 Audit
函数在内部调用 Raise
事件,该事件在事件查看器中记录消息。 因此,转到开始->运行->输入 eventvwr。 它包含诸如堆大小、线程数、工作集数量、域数和请求拒绝等信息,如下图所示
