2

我很混乱。虽然我在 C# 方面有相当的背景,但这是我第一次接触 WCF。

我有一个 C# 桌面应用程序,它执行一些功能,例如从本地 xml 文件中获取数据,以及其他各种功能,我不需要在这里解释,因为它们与这个问题无关。现在我需要使用 WCF 服务的 URL 来获取一些其他数据以在我的应用程序中使用。

我在网上读到的关于 WCF 的内容越多,越是阅读教程,我就越感到困惑。这就是为什么我在这里要求对我的问题提供一个非常简单、清晰、直接的答案。我不是在寻找任何花哨或高级的东西,比如设置 WCF 服务库或 WCF 服务应用程序。我只是 WCF 的初学者,想在我现有的 C# 桌面应用程序中使用 WCF 服务 URL 来获取一些数据。WCF 服务是由其他人提供给我的,并且工作正常。在回答这个问题时请记住,我是 WCF 的新手,所以对这个主题的初学者级别的回答是最好的。

这是我到目前为止所做的:

  1. 创建了一个可以正确构建和运行的 C# Windows 窗体应用程序。该应用程序在 Form1 类中有一些自定义类、一个用于数据检索的本地 xml 文件以及一些用于按钮单击等的事件处理程序。
  2. 我将 WCF 服务引用添加到我的项目中(即,右键单击项目 > 添加服务引用 > 粘贴到 url > Go > Ok.
  3. 添加了System.Data.Services.Client对我的项目的引用。虽然我不知道这是否需要。
  4. 在事件处理程序所在的 Form1 类中,我使用指令添加了以下内容:using MyProject.theServiceusing System.Data.Services.Client.
  5. 在 Form1 类的开头添加了这些全局变量:

    private Uri svcUri = new Uri("http://www ... service.svc");
    private ServiceClient context;

  6. 在 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对象中。

因此,查看上面的代码,我的下一步是将值从studentsto分配stds[0]我无法弄清楚的问题是铸造或转换的一些问题。如何将学生对象从 List 分配给 theService.Student[] 对象,以便我可以为服务提供一些数据来查找?

我试过这样做:

stds[0] = (theService.Student)students[0]; 

但当然我得到这个错误:

  • 无法将类型“MyProject.Student”隐式转换为“MyProject.theService.Student”

我知道这对某些人来说可能看起来非常简单和明显,但我无法弄清楚。我在谷歌上找不到答案。有人请帮忙。

4

2 回答 2

1

You're on the right track, you're just not calling the service as expected. The service expects you to pass in an array of Student objects, and it will return an array of Student objects.

theService.Student[] ServiceClient.GetFees(theService.Student[] students)

Try something like

var stds = new Student[];
stds[0] = s;  // the Student you set up

var ret = client.GetFees( stds );  // ret is an array of Student
f = ret[0];  since you only passed a single student in, the 1st item in the return array should be your student with fees

Now, look at f.Fees for your data.

You can shorten this code quite a bit; I wanted to show discrete steps.

于 2013-09-30T22:09:25.970 回答
1

您将本地信息存储在一个名为 的对象中Student,并且该服务需要一个名为的对象,Student但它们不是同一个东西。

我建议创建:

  • a)在您的学生对象上创建扩展方法以将其转换为服务学生对象
  • b)为您的学生对象创建一个显式转换为服务学生对象

但是,很长的路要走,比如:

theService.Student s = new theService.Student();
s.Name = students[0].Name; //these are example fields
s.Id = students[0].Id;     //these are example fields

var ret = client.GetFees(new theService.Student[] { s });  
于 2013-10-01T00:52:31.660 回答