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

我的第一个 COM+ 服务组件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.60/5 (5投票s)

2009年11月1日

CPOL

4分钟阅读

viewsIcon

38435

downloadIcon

373

只是分享我六年前,也就是 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 的引用。
  • 01.jpg

    您需要在 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* 实用程序创建一个密钥文件。要生成密钥文件,我们将运行 Visual Studio .NET 命令提示符,然后输入如下所示的命令
  • sn -k btnmail.snk

    02.jpg

  • 将“*testkey.snk*”复制到您的项目解决方案中。
  • 添加“*AssemblyInfo.vb*”并添加密钥信息
  • <Assembly: AssemblyTitle("")> 
    <Assembly: AssemblyCompany("")>
    <Assembly: AssemblyProduct("")> 
    <Assembly: AssemblyCopyright("")>
    <Assembly: AssemblyTrademark("")> 
    <Assembly: CLSCompliant(True)>
    <Assembly: AssemblyKeyFile("..\..\btnmail.snk")>
  • 现在我们需要将其安装到全局程序集缓存“GAC”中。
  • regsvcs (path of the dll)
  • 创建一个 *vbs* 文件来测试它。创建“*test.vbs*”,其中包含以下代码
  • set obj = CreateObject("smtpbtnmail.btnmail")
    msgbox(obj.HelloWord)
  • 双击它来运行它。
© . All rights reserved.