我很混乱。虽然我在 C# 方面有相当的背景,但这是我第一次接触 WCF。
我有一个 C# 桌面应用程序,它执行一些功能,例如从本地 xml 文件中获取数据,以及其他各种功能,我不需要在这里解释,因为它们与这个问题无关。现在我需要使用 WCF 服务的 URL 来获取一些其他数据以在我的应用程序中使用。
我在网上读到的关于 WCF 的内容越多,越是阅读教程,我就越感到困惑。这就是为什么我在这里要求对我的问题提供一个非常简单、清晰、直接的答案。我不是在寻找任何花哨或高级的东西,比如设置 WCF 服务库或 WCF 服务应用程序。我只是 WCF 的初学者,想在我现有的 C# 桌面应用程序中使用 WCF 服务 URL 来获取一些数据。WCF 服务是由其他人提供给我的,并且工作正常。在回答这个问题时请记住,我是 WCF 的新手,所以对这个主题的初学者级别的回答是最好的。
这是我到目前为止所做的:
- 创建了一个可以正确构建和运行的 C# Windows 窗体应用程序。该应用程序在 Form1 类中有一些自定义类、一个用于数据检索的本地 xml 文件以及一些用于按钮单击等的事件处理程序。
- 我将 WCF 服务引用添加到我的项目中(即,右键单击项目 > 添加服务引用 > 粘贴到 url > Go > Ok.
- 添加了
System.Data.Services.Client
对我的项目的引用。虽然我不知道这是否需要。 - 在事件处理程序所在的 Form1 类中,我使用指令添加了以下内容:
using MyProject.theService
和using System.Data.Services.Client
. 在 Form1 类的开头添加了这些全局变量:
private Uri svcUri = new Uri("http://www ... service.svc");
private ServiceClient context;在 Form1 类中,在按钮事件中,我有以下代码:
-
private void btnWebService_Click(object sender, EventArgs e)
{
ServiceClient client = new ServiceClient();
Student s = new Student();
// this is implemented as follows in the student class: public Fee[] Fees { get; set; }
Fee f = new Fee();
// need some logic here to get the data using the client object
client.Close();
}
客户端对象有一个名为 GetFees ( client.GetFees()
) 的方法,我认为使用此方法获取我需要的数据(即与学生相关的费用)是最合乎逻辑的选择。Visual Studio 给出了该方法的描述:
theService.Student[] ServiceClient.GetFees(theService.Student[] students)
我想要的是当我单击按钮并触发 btnWebService_Click 事件时,我调用服务,检索所需的数据,将其存储在适当的对象中,并根据需要使用数据。
我的问题是:
- 在第 6 步,我是否朝着正确的方向前进?
- 为了使 WCF 调用正常工作,我是否错过了任何步骤?
- GetFees() 方法让我感到困惑。如何编写正确的 C# 代码以在没有错误的情况下使用它?
我尝试在事件处理程序中编写这行代码:
f = client.GetFees(s.Fees[0]);
但我在 Visual Studio 中收到以下错误:
- 'MyProject.theService.ServiceClient.GetFees(MyProject.theService.Student[])' 的最佳重载方法匹配有一些无效参数
- 参数 1:无法从 'MyProject.Fee' 转换为 'MyProject.theService.Student[]'
我在这里做错了什么?或者这条线是否接近我需要的任何东西?
我故意从这个问题中排除了 WCF 服务的完整 url。如果它有助于正确回答这个问题,请告诉我,我会给你。此外,还有一个 wsdl 网址。让我知道它是否可以帮助您回答我的问题。
预先感谢您阅读所有这些内容。我欢迎并感谢您提供的任何帮助。
- - - - - - - - - - - - - 编辑 - - - - - - - - - - - - -
根据我收到的一些帮助,我非常接近解决方案。但我还有一个问题。
此代码编译并运行:
private void btnWebService_Click(object sender, EventArgs e)
{
ServiceClient client = new ServiceClient();
theService.Student s = new theService.Student();
theService.Student[] stds = new theService.Student[30];
stds[0] = s;
var ret = client.GetFees(stds);
client.Close();
}
但是,我从 Visual Studio 收到以下错误:
- 无效的学生 ID (=0)。StudentID 必须大于 0。
发生此错误是因为 中的值为stds[0]
空。
在我的程序的不同部分,我有一个 LINQ 查询,它从 xml 文件中获取学生数据并将其存储在一个List<Student> students
对象中。
因此,查看上面的代码,我的下一步是将值从students
to分配stds[0]
。我无法弄清楚的问题是铸造或转换的一些问题。如何将学生对象从 List 分配给 theService.Student[] 对象,以便我可以为服务提供一些数据来查找?
我试过这样做:
stds[0] = (theService.Student)students[0];
但当然我得到这个错误:
- 无法将类型“MyProject.Student”隐式转换为“MyProject.theService.Student”
我知道这对某些人来说可能看起来非常简单和明显,但我无法弄清楚。我在谷歌上找不到答案。有人请帮忙。