c# - 从WCF获取数据

标签 c# .net wcf web-services

我很混乱。尽管我有一定的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.theServiceusing 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/

相关文章:

c# - C# 中的 if/then/else 变量挫折

c# - 更新 ASP.NET 中现有用户的配置文件

c# - SendMailAsync 从不返回,仍然发送邮件

c# - 将字符串转换为十进制分隔符 "."和 ","不敏感方式的最佳方式?

c# - 如果凭据错误,我可以禁用 MS CRM 2011 SDK 的登录提示吗?

c# - 将 OData 语法与 WebAPI 和 DAL 结合使用

.net - 你如何测试你的业务对象?

.net - 如果Unity不在GAC中,VS如何知道在添加引用中显示它?

javascript - 使用 moment.js 或其他 javascript 库生成 WCF JSON 格式的日期

wcf - DataContractSerializer 与 XmlSerializer 之间的区别