构建通用的数据源 Web 服务
如何构建一个多用途 Web 服务来接收多个数据馈送。
引言
电子数据传输是机构之间共享数据的有效且理想的解决方案。本文旨在说明一种替代的通用方法,使用具有接收任意数量数据馈送能力的 Web 服务。数据文件由一个自定义程序处理,该程序监视交付文件夹。
背景
我所在机构正在开发电子数据馈送,以便更有效地与其他刑事司法机构共享案件数据。通过电子方式发送数据,我们可以节省数据录入时间和减少转录错误。我们希望找到一种解决方案,允许任何机构开始发送数据,而无需为每个机构创建一个新的 Web 服务。
概述
该解决方案使用命令和工厂设计模式来创建易于适应的服务。命令对象封装处理数据馈送的工作 - 为每个馈送创建一个不同的命令对象。工厂方法由服务用于通过名称实例化所需的命令对象。该服务接受两个 String
参数:数据馈送的名称和数据本身。
本文假定您知道如何在 Visual Studio 中设置 ASP.NET Web 服务解决方案。
Using the Code
对于本文,我将仅显示和讨论“万能”命令对象的代码以及如何在服务中使用它。
“CaseElse”命令类
该类的目的是处理未识别的数据馈送;即:没有与相同名称的命令对象的数据馈送。Execute()
方法执行以下操作
- 确保基本目录存在。
- 确保在基本目录中存在一个与数据馈送名称相同的目录。
- 使用当前日期/时间(精确到毫秒)作为文件名,将数据保存在适当的目录中。
该类继承自 ACommand
,这是一个抽象类,其中包含我需要的一切,除了 Execute()
方法的实现。您可以在下载中查看它。CaseElse
类的代码如下所示
Imports System.IO
Imports System.Data
Imports Microsoft.VisualBasic
Public Class CaseElse
Inherits ACommand
Public Overrides Function Execute( _
ByVal args As PropertyCollection _
) As Object
Dim feedName As String = args("feedName")
Dim xmlData As String = args("xmlData")
Dim fileName As String = Format(Date.Now, _
"yyyyMMddhhmmssfff") & ".xml"
Dim wrt As StreamWriter
Try
If Not Directory.Exists(mBaseDirectory) Then
Directory.CreateDirectory(mBaseDirectory)
End If
If Not Directory.Exists(mBaseDirectory & feedName & "\") Then
Directory.CreateDirectory(mBaseDirectory & feedName & "\")
End If
wrt = New StreamWriter(mBaseDirectory & feedName & "\" & fileName)
wrt.Write(xmlData)
wrt.Flush()
wrt.Close()
Return "Okay"
Catch ex As Exception
Return ex.ToString
Finally
wrt = Nothing
End Try
End Function
End Class
“Service”类的 Send() 方法
Send()
方法接受两个 String
参数:数据馈送的名称和数据本身。它使用 System.Activator
类的 CreateInstance()
方法尝试实例化一个与日期馈送名称相同的命令对象实例。如果失败,则实例化 CaseElse
命令对象。然后初始化命令对象,并将 Execute()
方法的结果发送回 Web 服务的消费者。
Service()
方法的代码如下所示
<webmethod()> _
Public Function Send( _
ByVal feedName As String, _
ByVal xmlData As String _
) As String
Dim cmd As ACommand
Dim args As PropertyCollection
Dim pHandle As System.Runtime.Remoting.ObjectHandle
Try
args = New PropertyCollection
args.Add("xmlData", xmlData)
Try
pHandle = System.Activator.CreateInstance("App_Code", "App_Code." & feedName)
cmd = CType(pHandle.Unwrap, ACommand)
Catch ex As Exception
cmd = New CaseElse
args.Add("feedName", feedName)
End Try
cmd.Initialize(feedName)
Return DirectCast(cmd.Execute(args), String)
Catch ex As Exception
Return ex.ToString
Finally
pHandle = Nothing
cmd = Nothing
End Try
End Function
摘要
本文概述了构建通用数据馈送 Web 服务的关键概念。Web 服务的完整源代码在下载文件中。它是在 Visual Studio 2008 中编写的。