65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (13投票s)

2010年3月14日

CPOL

4分钟阅读

viewsIcon

58927

downloadIcon

334

启用 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 字段:msgcreatedmsgraisedWebProcessStatistics。 通过使用 msgcreatedmsgraised,我们可以跟踪事件的创建和引发时间。 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。 它包含诸如堆大小、线程数、工作集数量、域数和请求拒绝等信息,如下图所示

© . All rights reserved.