我很混乱。尽管我有一定的C#背景,但这是我第一次接触WCF。
我有一个C#桌面应用程序,该应用程序执行一些功能,例如从本地xml文件中获取数据,以及其他各种功能,在此无需赘述,因为它们与该问题无关。现在,我需要为WCF服务使用URL,以获取其他一些要在应用程序中使用的数据。
我在线阅读有关WCF的信息越多,遍历教程的内容越混乱。这就是为什么我要在这里对我的问题提出一个非常简单,清晰,直接的答案。我不需要任何高级或高级的东西,例如设置WCF服务库或WCF服务应用程序。我只是WCF的初学者,他想在现有C#桌面应用程序中使用WCF服务URL来获取一些数据。 WCF服务是由其他人提供给我的,并且正在正常运行。在回答这个问题时,请牢记我是WCF的新手,因此对此主题的初学者级别的答案是最好的。
到目前为止,这是我所做的:
创建了正确构建并运行的C#Windows窗体应用程序。该应用程序具有一些自定义类,一个用于数据检索的本地xml文件以及一些用于按钮单击的事件处理程序,例如Form1类。
我将WCF服务引用添加到了我的项目中(即,右键单击项目>添加服务引用>粘贴到url中>执行>确定。
在我的项目中添加了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服务的完整网址。如果可以正确回答此问题有帮助,请告诉我,我会给您。另外,还有一个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中收到以下错误:
无效的StudentID(= 0)。 StudentID必须大于0。
发生此错误的原因是
stds[0]
中的值为空。在我程序的另一部分中,我有一个LINQ查询,该查询从xml文件中获取学生数据并将其存储在
List<Student> students
对象中。因此,看上面的代码,我的下一步就是将值从
students
分配给stds[0]
。我无法弄清的问题是转换或转换方面的问题。如何将List中的学生对象分配给theService.Student []对象,以便可以向服务提供一些要查找的数据?我尝试这样做:
stds[0] = (theService.Student)students[0];
但是我当然会收到此错误:
无法将类型“ MyProject.Student”隐式转换为“ MyProject.theService.Student”
我知道这对某些人来说似乎很简单明显,但是我无法弄清楚。我在Google上找不到答案。有人请帮忙。
最佳答案
您将本地信息存储在名为Student
的对象中,服务需要一个名为Student
的对象,但它们不是同一对象。
我建议创建:
a)在您的学生对象上创建extension method以将其转换为服务学生对象
b)为您的学生对象创建explicit conversion到服务学生对象中
但是,很长的路要走。
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 });
关于c# - 从WCF获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19104357/