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

如何在 VB.NET 中创建 WCF WebService

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2017年5月4日

CPOL

9分钟阅读

viewsIcon

55412

downloadIcon

1434

WCF WebService IN VB.NET Response JSON

引言

本文旨在向所有开发人员展示如何创建一个简单的 WCF Web Service,该服务可以被软件或 Web 客户端调用。我们的 WCF 需要进行的响应将是:XML 响应和 JSON 响应。此外,我们将讲解如何通过 URITemplates 来调用此 WCF WS(如果您不知道 URItemplates 的含义,请不用担心,我将在本文中进行解释)。

那么,开始吧!

背景

好了,在我们开始本文之前,我们需要了解这些要求

  1. 您必须拥有 VS 2017 社区版。(下载链接:https://www.visualstudio.com/es/
  2. POSTMAN(用于测试我们的 WCF,可选)
  3. Google Chrome(重要:如果我们不下载 POSTMAN,则可以使用此浏览器来测试我们的 WCF)

Using the Code

好了,我们开始吧。

第一步 - 首先,我们需要安装 Visual Studio 2017(VS 2015 也可以)

第二步 - 安装完 Visual Studio Community 后,请记得重启您的电脑。

第三步 - 现在……让我们来编写 WCF Web Service。

编写我们的 WCF Web Service

打开您的 Visual Studio 2017 community,然后选择 **文件** > **新建** > **项目**,接着在左侧栏中选择

VISUAL BASIC>Classic Windows Desktop>Console App(如下图所示)

注意:请记住,我的 VS 2017 community Edition 是西班牙语版的!!我不得不为你们翻译所有标签。:)

然后,您应该将项目名称更改为 WCF_WS_Employee,如下面的图像所示。
为了更好地组织您的项目,您应该更改项目路径。

好的,在您更改了项目名称和项目路径后,让我们点击“确定”或“接受”来创建项目,项目创建完成后的样子如下:

当 Visual Studio 创建项目时,它会包含一些文件来构成整个解决方案。

您将看到一个 Module1.vb 文件,已准备好开始编写代码。

好了,既然 Microsoft 创建了 WCF,我们需要一些命名空间来帮助我们更轻松地进行结构化工作。因此,我们需要导入一些命名空间。

system.runtime.serialization
System.ServiceModel.Description
System.ServiceModel
System.ServiceModel.Activation

当您导入命名空间时,您会看到一条绿色的波浪线。接下来的一步是向我们的项目添加引用,如下所示:右键单击“**项目名称**” > **添加** > **引用**。

然后,勾选我们上面列出的命名空间:下图向您展示了如何勾选这些选项。

当您勾选并单击“**接受**”后,您会看到绿色的波浪线消失了,这意味着命名空间已成功添加!!

添加 Employee 类

好了,下一步是添加我们的类,它将帮助我们以 XML 格式或 JSON 格式进行响应。
右键单击解决方案**名称** > **添加** > **类**

然后重命名 VS 提供的默认类。将其重命名为 employee

如下面的图片所示

然后单击“接受”,Employee 类就会被添加到我们的项目中。 :)

好了,这是我们需要做一些工作的地方。首先,我们需要一些属性。我们将这些属性命名为:IdEmployeeNameLastName

WCF 始终使用“**服务契约**”和“**操作契约**”进行工作,因此我们需要导入
System.runtime.Serialization,同时也支持 DataContractDataMember 这些函数为类被公开到 WCF 响应中提供了功能。不用担心,我稍后会解释这些属性的含义。好了,继续阅读本文。

这里是每个属性的数据类型

  • IdEmployee => Integer
  • Name => String
  • LastName => String
  <DataMember>
    Public Property IdEmployee() As Integer
        Get
            Return m_IdEmployee
        End Get
        Set(ByVal value As Integer)
            m_IdEmployee = value
        End Set
    End Property

我们还需要一个构造函数类,在我们将参数添加到集合时使用。该构造函数接受以下参数:IdEmployeeNameLastName

Public Sub New(ByVal IdEmplyee As Integer, ByVal Name As String, ByVal LastName As String)
        Me.m_IdEmployee = IdEmplyee
        Me.m_Name = Name
        Me.m_LastName = LastName
    End Sub

完成后,我们的 employee 类看起来是这样的:

如您所见,employee 类只有 system.runtime.serialization,因为 employee 类需要 WCF 可访问。(DataMemberDataContract

请记住,所有术语将在最后解释。我是一个认为我们需要先举例再讲理论的人。我们的大脑与图像一起工作效率更高。

好的,我们继续前进。

在创建了 Employee class 之后,我们需要回到 module1.vb,来编写**接口服务**。

在我们的 Module.vb 中,请输入以下代码:

<ServiceContract>
Public Interface IService

End Interface

Public Class Service
   Implements IService

End Class

我们为什么只在 IService 上方编写 <SERVICECONTRACT>?好了,INTERFACE 帮助我们定义 WCF 可以解析或响应的输入和输出,并公开我们在该部分中定义的各种方法。

INTERFACE 允许定义可以访问多少个方法,但在这里我们无法定义方法的逻辑。为此,我们需要实现INTERFACE到一个类中,该类可以包含公开方法的逻辑和代码。因此,我们需要创建一个 Service 类,这个类将帮助我们实现INTERFACE,您的部分应该看起来像这样:

如果您看不到在哪里实现IServiceService中,请不要担心。请稍等片刻。

好的,首先我们需要声明我们的方法来公开它。

<ServiceContract>
Public Interface IService

<OperationContract()>
<webGet()>
function SeekEmployee() AS List(Of employee)

End Interface

您会看到,我们写了<OperationContract()><WebGet>。OPERATION CONTRACT 用于告知 INTERFACE,该方法需要在 WCF Web 服务中显示。如果我们不添加此标签,该方法将无法被任何人访问。

好了,下一部分是定义我们称为SeekEmployee的方法的**主体**或**逻辑**。要定义方法的**主体**,我们需要关注Public Class Service,正是在这个类中,我们编写了所有的逻辑。

我们将创建一个集合来添加一些数据,然后以 XML 格式或 JSON 格式公开结果。

记住:您可以使用 SQL 连接来获取一些数据作为示例……但建议您保持现状,完成本文后,您可以修改以动态获取数据。

好了,要做到这一点,请将以下代码复制并粘贴到 Class service 中,或者 Remove Class service。

Public Class Service
    Implements IService

    Public Function SeekEmployee(ByVal DataToMerge As String) _
           As List(Of employee) Implements IService.SeekEmployee
        Dim EmployeeCollection As New List(Of employee)()

        EmployeeCollection.Add(New employee(1, DataToMerge & "Matt", "Daimon"))
        EmployeeCollection.Add(New employee(2, "Arnold", "Mendez"))
        EmployeeCollection.Add(New employee(3, "Silvester", "Stallone"))
        EmployeeCollection.Add(New employee(4, "Scarlet", "johanson"))
        EmployeeCollection.Add(New employee(5, "Jean Claude", "VanDame"))
        EmployeeCollection.Add(New employee(6, "Terminator", "Baby"))
        EmployeeCollection.Add(New employee(7, "John", "HILL"))
        EmployeeCollection.Add(New employee(8, "Steven", "Hall"))
        EmployeeCollection.Add(New employee(9, "Renee", "Ruso"))
        Return EmployeeCollection
    End Function
End Class

您会看到,我们使用 Implements IService 来告诉接口,我们需要将 Service 类中定义的方法暴露出来!!

这是它的样子:

好了,到目前为止,我们已经完成了:

  1. 导入命名空间并添加项目引用
  2. 我们添加了 employee.vbemployee 类)(DataContractDataMember
  3. 我们定义了:方法(OperationContract)和方法体(Class service)

好了,我们几乎完成了在 VB.NET 中使用 FW 4.1 或更高版本创建自己的 WCF WebService

下一步是托管我们的 WebService:有三种方法可以托管我们的 WebService

  • IIS
  • Windows 服务
  • 自托管

每种方法都有优点和缺点,但托管 WCF WebService 的最简单方法是:自托管。

使用自托管,您只需要做以下事情:

在控制台的 Main 部分,编写以下代码:

Module Module1
    Sub Main()

        Dim SetupWCF As WebServiceHost = New WebServiceHost(GetType(Service), 
                                         New Uri("https://:8000/"))
        SetupWCF.Open()
        Console.WriteLine("Press <ENTER> to stop the WCF Self-Hosted")
        Console.ReadLine()
    End Sub

End Module

完成了!!!

***在运行您的项目之前,请牢记这一点。***

本文旨在以本地模式运行(http://locahost:8000),但如果您感觉自己是“世界上最幸运的人”,您也可以在生产环境中进行测试,但请务必小心。

例如,如果您的网站是 http://www.abc1234.com,并且您想将 abc1234.com 替换 localhost,您可以这样做,但如果在此时,您的某些客户访问您的网站,这将引发一个错误,如“此站点无法访问或站点正在维护”。为避免这种情况,请添加一个子文件夹,如

www.abc1234.com/test/

像这样

Module Module1
    Sub Main()

        Dim SetupWCF As WebServiceHost = New WebServiceHost(GetType(Service), 
                                         New Uri("http://www.abc1234.com/test/"))
        SetupWCF.Open()
        Console.WriteLine("Press <ENTER> to stop the WCF Self-Hosted")
        Console.ReadLine()
    End Sub

End Module

好了,在解释完这些之后,是时候进行测试了。

运行您的项目,一个控制台将会出现。

现在打开 POSTMAN 软件并复制粘贴链接。粘贴链接后,WCF 在这里就能工作了。

将方法添加到您的链接,例如:https://:8000/seekEmployee 到 POSTMAN 的输入框中。
然后,单击“**发送**”按钮。

当您单击“**发送**”按钮时,**POSTMAN** 会请求 WCF 上的 seekEmployee 方法,其 XML 响应如下所示:

如果到目前为止一切顺利……那么……您真是个幸运的人!!

好了,这是最常见的 XML 格式响应。通过这种 XML 格式,我们可以看到响应被包裹在 employee 标签中,这意味着所有数据都已**成功**返回。

如何使用此 WCF Webservice 返回 JSON?

好了,要做到这一点,我们需要回到 Module1.vb 中的 SERVICECONTRACT
正是这里的 <webGet>,我们可以配置我们应用程序所需的响应类型。

只需在 WebGet 中添加以下几行:
<WebGet(ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Bare)>

此参数将我们的 WCF Interface 配置为响应 JSON。下图显示了这一点:

完成后,修改 WebGet,然后切换窗口,再次聚焦 POSTMAN,然后再次单击“发送”按钮,看看会发生什么。 :)

是的!!我们得到了一个 JSON 响应,可以将其添加到各种客户端,如互联网浏览器、移动设备、桌面软件等。

我可以将参数传递给我的 WCF 吗?

是的!您可以!!

只需这样做:

  1. 在INTERFACE 部分的 SeekEmployee 函数中添加一个参数。我添加了一个名为 DataToMerge 的参数。
  2. seekEmployee 函数(在 Public class service 内部)中,添加一个与 INTERFACE 参数相同的参数。
  3. Var 合并到您的数据中。

我们将设计一个简单的布局,并针对所有可能的分辨率进行验证。

完成添加 Var 后,返回 POSTMAN,然后更改链接。

https://:8000/seekEmployee?DataToMerge=TESTING 而不是 https://:8000/seekEmployee

然后单击发送按钮,现在 DataToMerge 的值将会合并到第一个索引的 NAME 属性中,如下所示:

如您所见,当方法不需要参数时,它可以被调用为 SubDomineSubFolder

但当它需要参数时,它会适应。

为我们的 WCF WebService 添加 UriTemplate

好了,要添加此功能并允许开发人员像这样调用您的 WCF WebService:

https://:8000/seekEmployee/TESTING

我们需要对我们的 <WebGet> 进行一些小的更改。

URITemplates 用于确定哪些请求发送到哪个服务操作。

因此,队列需要向 <WebGet> 选项添加另一个参数,即:UriTemplate

只需添加“SeekEmployee/{DataToMerge}”。请记住这个重要事项。

URI 模板**始终**包含函数名/变量名,就像示例一样。

这样就完成了!!!回到 POSTMAN,然后在搜索框中输入:https://:8000/seekEmploye/TESTING

我们完成了!!!

请记住,本文仅用于了解 WCF XML 响应和 JSON 响应的结构和构成方式。

关注点

请记住,自托管的 WCF WebService 速度很快,但如果配置不当,可能会影响其他访问您网站的用户。

此外,您也可以在 Google Chrome 中测试此 WCF Web Service。 :)

如果您有任何疑问,请随时提问,好吗?

致以最诚挚的问候!!!

如果我的文章以任何方式帮助了您……请给我一些星。

历史

  • 2017 年 5 月 4 日:初始版本
© . All rights reserved.