gpt4 book ai didi

vb.net - 调用 Web 服务函数从 Windows 窗体返回列表(字符串)

转载 作者:行者123 更新时间:2023-12-02 00:11:06 24 4
gpt4 key购买 nike

我有一个具有多种功能的 Web 服务,可以处理 SQL Server 2012 数据库。我的目标是拥有一个使用此 Web 服务功能来选择和插入数据库的 Windows 服务。

当前的网络服务有不同的函数类型,返回 bool 值、字符串或字符串列表。除了从 Windows 窗体调用返回字符串 getGames () 列表的函数时,一切都工作正常。 (Windows 窗体作为 Windows 服务的副本)

错误:“一维对象数组”类型的值无法转换为“System.collections.generic.list(Of String)”

我从 Windows 窗体项目添加了一个 Web 服务 - 添加服务引用 > 高级 > 添加 Web 引用。我还是一名学生,所以我在网络服务方面没有太多经验。 Windows 服务是在 Framework 3.5 上创建的,Windows 窗体是在 Framework 4.5 上创建的(不确定这是否有所不同)错误:

listOfGames = ws.getGames("username123", "password123") '** Error Here

这是网络服务功能

<WebMethod()> _
Public Function getGames(ByVal username As String, ByVal password As String) As List(Of String)
Dim m As DBMember = DBMember.verifyUsername(username, password)
If m IsNot Nothing Then
Dim gList As New List(Of String)
gList = DBGame.selectAllGames()
Return gList
End If
Return Nothing
End Function

下面是我调用网络服务函数的方式:

    Private Sub onStart()
Dim ws As localhost.Service1 = New localhost.Service1
listOfGames = ws.getGames("username123", "password123") '** Error Here
End Sub

这是查询:

 Shared Function selectAllGames() As List(Of String)
Dim cmd As New SqlCommand
cmd.CommandText = "SELECT g_Exe FROM Game"
cmd.Connection = DB.Conn()

Dim rdr As SqlDataReader = cmd.ExecuteReader()
Dim gList As New List(Of String)

If rdr.HasRows Then
While rdr.Read
gList.Add(rdr.Item("g_Exe").ToString())
End While
End If

DB.CloseDB()
Return gList
End Function

最佳答案

发生这种情况的原因是因为您的 Web 服务没有返回实际的 .NET List 对象,它只是使用列表的标准 SOAP 格式返回列表的 XML 表示形式。因此,用于返回客户端数据的类型完全由客户端代码决定。

当您添加对 Web 服务的引用时,Visual Studio 会自动为您生成代理类。代理类是在服务器端定义的 Web 方法的客户端副本。但是,对于列表,客户端无法知道 Web 方法返回的特定 .NET 类型的列表。据它所知,Web 服务可能根本就不是用 .NET 语言编写的。因此,它必须任意选择一种方式来表示代理类中的数据。代理类中使用的默认列表类型是简单数组。

当您添加对 Web 服务的引用时,如果您将其添加为 Web 引用,您将无法指定用于列表的类型。 Web References 总是使用数组作为列表。但是,如果您将引用添加为服务引用,那么您可以更改将在代理类中使用的类型来表示列表。为此,在添加引用时,单击高级 按钮。然后,在 Data Type 部分将 Collection typeSystem.Array 更改为 System.Collections.Generic.List.

如果您无法使用数组来保留代理类,您仍然可以通过简单地将数组转换为 List 来使其正常工作,如下所示:

Dim listOfGames As New List(Of String)()
listOfGames.AddRange(ws.getGames("username123", "password123"))

关于vb.net - 调用 Web 服务函数从 Windows 窗体返回列表(字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com