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

构建通用的数据源 Web 服务

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2010年12月31日

CPOL

2分钟阅读

viewsIcon

22677

downloadIcon

194

如何构建一个多用途 Web 服务来接收多个数据馈送。

引言

电子数据传输是机构之间共享数据的有效且理想的解决方案。本文旨在说明一种替代的通用方法,使用具有接收任意数量数据馈送能力的 Web 服务。数据文件由一个自定义程序处理,该程序监视交付文件夹。

背景

我所在机构正在开发电子数据馈送,以便更有效地与其他刑事司法机构共享案件数据。通过电子方式发送数据,我们可以节省数据录入时间和减少转录错误。我们希望找到一种解决方案,允许任何机构开始发送数据,而无需为每个机构创建一个新的 Web 服务。

概述

该解决方案使用命令和工厂设计模式来创建易于适应的服务。命令对象封装处理数据馈送的工作 - 为每个馈送创建一个不同的命令对象。工厂方法由服务用于通过名称实例化所需的命令对象。该服务接受两个 String 参数:数据馈送的名称和数据本身。

本文假定您知道如何在 Visual Studio 中设置 ASP.NET Web 服务解决方案。

Using the Code

对于本文,我将仅显示和讨论“万能”命令对象的代码以及如何在服务中使用它。

“CaseElse”命令类

该类的目的是处理未识别的数据馈送;即:没有与相同名称的命令对象的数据馈送。Execute() 方法执行以下操作

  1. 确保基本目录存在。
  2. 确保在基本目录中存在一个与数据馈送名称相同的目录。
  3. 使用当前日期/时间(精确到毫秒)作为文件名,将数据保存在适当的目录中。

该类继承自 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 中编写的。

© . All rights reserved.