我的第一个 COM+ 服务组件
3.60/5 (5投票s)
只是分享我六年前,也就是 2003 年,作为开发人员的经验。
引言
在这个互联网互联网络应用程序的世界中,可以合理地期望您的 Web 应用程序能够扩展以满足数百万将访问您网站的用户的需求。COM+ 是 Windows DNA 2000 方法中创建可扩展、可扩展和可维护的分布式应用程序的核心元素。然而,在 .NET 世界中,COM+ 组件被称为服务组件。由于 .NET 策略中的诸多变化,服务组件的部署模型与部署传统的 COM+ 组件不同。在本文中,我们将了解如何使用 .NET Framework 提供的各种工具来部署服务组件。在此过程中,我们还将重点介绍不同类型的服务组件的部署模型如何变化。最后,我们将通过了解如何使用 Windows Installer 项目自动部署服务组件来总结它。
Windows 2000 中的组件服务具有丰富的企业功能,提供了创建分布式、Web 应用程序所需的所有管道。尽管 COM+ 服务最初是为 COM 组件设计的,但如果 .NET 组件也可以使用它们,那将是很好的,因为 COM+ 运行时提供了对象池、数据库连接池、共享资源、基于角色的安全性和分布式事务处理监控等服务。
在 .NET Framework 中,有一个名为 System.EnterpriseServices 的单独命名空间,其中包含为应用程序提供 COM+ 服务所需的所有类。有关 COM+ 的介绍,请查看 TechNet 提供的以下链接:COM 和 COM+ 简介。
问题
我们有一个 Web 服务器,它托管着许多不同的应用程序,包括经典 ASP 网站、ASP.NET 应用程序和在 MS-Tasks 中调度的控制台应用程序。所有这些应用程序都使用我们的 SMTP 服务器发送电子邮件。我们的 SMTP 服务器需要用户身份验证。我们有一个专用于我们的网络的电子邮件帐户,用作我们所有应用程序的发件人电子邮件 ID。
想象一下,您的开发经理要求您出于安全原因更改该电子邮件帐户的密码,并且他计划每个月经常更改它。您需要遍历所有 .NET 应用程序的 *web.config* 文件并更改电子邮件设置,以及所有经典 ASP 网站也要更改包含文件,这确实很痛苦。
解决方案
我相信现在有很多解决方案可以解决上面提到的问题,但在这里我只是分享我六年前(即 2003 年)在一家软件开发公司担任开发人员时的经验。当时,我在 Classic ASP 方面有很好的经验,但在 .NET 方面只有两年的经验。我们当时使用的是 MS VS2003,并且使用 VB.NET 进行编码。我对 C# 不是很熟悉 :)
我首先想到的是创建一个全局 DLL 文件,该文件将读取位于我们 Web 服务器上的单个配置文件;这个 DLL 文件可以在任何应用程序中使用,无论是经典 ASP、.NET 还是 Java 应用程序。
我利用 COM+ 服务组件开发了一个类库,该类库具有用于发送电子邮件的公共函数。电子邮件设置将从位于 Web 服务器上的 XML 配置文件中读取。
Using the Code
在这里,我将逐步解释我的解决方案(在 VS2005 中)
- 在 VS2005 中,创建一个类库项目。
- 添加对 *System.EnterpriceServices* DLL 的引用。

您需要在 Imports 部分添加以下行
Imports System.EnterpriseServices
ServicedComponent”类Public Class btnmail
Inherits EnterpriseServices.ServicedComponent
HelloWorld),仅用于测试目的' Shows Explicit SetComplete/SetAbort.
Public Function HellowWorld() As String
ContextUtil.SetComplete()
Return "Hello World"
End Function
Public Function SendEmail(ByVal sender, ByVal sname, ByVal recipient, _
ByVal cc, ByVal subject, ByVal body) As Boolean
Dim retVal As Boolean = False
Try
'defining dataset
Dim ds As DataSet = New DataSet()
'reading email setting config file.
'here i am hard-coding the location of the config.xml file.
'refer to the source code to see the config file structure.
ds.ReadXml("d:\smtpmailsetting\config.xml")
' assigning the values to the vars.
Dim smtpserver As String = ds.Tables(0).Rows(0)("ServerName")
Dim UserName As String = ds.Tables(0).Rows(0)("UserName")
Dim Password As String = ds.Tables(0).Rows(0)("Password")
Dim bcc As String = ds.Tables(0).Rows(0)("BCC")
ds.Dispose()
' creating email message object
Dim message As New MailMessage()
message.IsBodyHtml = True
message.From = New MailAddress(sender, sname)
message.To.Add(recipient)
If Not String.IsNullOrEmpty(cc) Then
message.CC.Add(cc)
End If
If Not String.IsNullOrEmpty(bcc) Then
message.Bcc.Add(bcc)
End If
message.Subject = subject
message.Body = body
Dim emailClient As New SmtpClient(smtpserver)
'check to see if there are user name and password,
' then only i am doing the authentication part.
If Not String.IsNullOrEmpty(UserName) And _
Not String.IsNullOrEmpty(Password) Then
Dim SMTPUserInfo As New _
System.Net.NetworkCredential(UserName, Password)
emailClient.UseDefaultCredentials = False
emailClient.Credentials = SMTPUserInfo
End If
emailClient.Send(message)
retVal = True
ContextUtil.SetComplete()
Catch ex As Exception
'logging the error to a log file if there is any.
Dim sw As StreamWriter = _
New StreamWriter("d:\smtpmailsetting\logs\" & _
Now.ToString("ddMMyyyy-hhmmss") & ".log", True)
Try
sw.Write(ex.Message)
Catch ex1 As Exception
Finally
sw.Flush()
sw.Close()
End Try
retVal = False
ContextUtil.SetAbort()
End Try
Return retVal
End Function
sn -k btnmail.snk

<Assembly: AssemblyTitle("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("")>
<Assembly: AssemblyCopyright("")>
<Assembly: AssemblyTrademark("")>
<Assembly: CLSCompliant(True)>
<Assembly: AssemblyKeyFile("..\..\btnmail.snk")>
regsvcs (path of the dll)
set obj = CreateObject("smtpbtnmail.btnmail")
msgbox(obj.HelloWord)
