c# - 如何在客户端使用自定义类型对象

标签 c# .net wcf web-services iis

我是 C# 和 WCF 的新手,有 Java 背景。

我有一个解决方案,它在 IIS 上托管了一个 WCF 服务,它有一个 Employee 类和一个方法...

public Employee getEmployee(int loginId)

此方法获取 loginId,查询数据库并使用结果创建一个 Employee 对象,然后返回 Employee 对象。很简单。

所以我有一个客户端,到目前为止它所做的只是调用一个简单的“Hello World”网络方法来向我证明它的配置正确,可以与服务对话。现在我想要一个登录按钮来获取输入的 loginId,调用 getEmployee,并使用返回值创建一个本地 Employee 对象。

所以,我对应该如何在客户端定义 Employee 类感到困惑?关于如何做如此简单的事情的信息并不多;与 AXIS2 和 NetBeans for Java 一样,这将非常简单,有很多教程来展示如何操作,但对于 WCF,似乎每个教程都假设了某些我不具备的知识。

所以下面的帖子说,这可以通过在单独的程序集中定义我的 Employee 类,并从 WCF 服务项目和客户端项目(顺便说一句,两者都在单独的解决方案中)引用 .dll 来完成。

WCF passing a custom object to client and running it's methods

它说“你可以创建一个契约(Contract)程序集(一个包含你的瘦域模型(例如人等)的程序集,你可以向其中添加你自己的逻辑。”,但没有解释如何做到这一点或提供任何引用到哪里可以找到更多信息或说明。

无论如何,我的 Employee 类已经直接在 WCF 服务项目中定义了。如果有人可以提供有关如何将其移动到“契约(Contract)程序集”的任何信息(我是 C# 菜鸟,之前甚至从未创建过 DLL;只是 Windows 窗体项目),将不胜感激。

此外,我在同一篇帖子的另一个答案中看到以下...

"1.如果你不能改变dll的源并且想调用dll的公共(public)方法,最好使用反射。所以,你从WCF接收对象,用返回值设置Person属性,调用方法”

我理解上面的概念;我会在客户端定义一个单独的 Employee 类,然后以某种方式使用反射从 web 方法返回的对象中获取值,并将它们分配给一个新的 Employee 对象,对吗?只是,我不知道如何使用反射来获取值。

最佳做法是什么?我是否应该像其他帖子建议的那样定义一个 IEmployee 接口(interface),然后将其放入具有常规 Employee 类的 DLL 中,并从服务器和客户端引用它,并从 Web 方法返回 IEmployee 而不是 Employee ?如果这是最好的做法,是否有什么特别的事情需要做,或者只要这样的 DLL 是双方的引用,我真的可以做这样的事情吗?

int loginId = Int32.Parse(this.loginInputTxt.Text);
LaborService.LaborServiceClient proxy = new LaborService.LaborServiceClient();
Employee emp = (Employee)proxy.getEmployee(loginId);

最佳答案

WCF 支持开箱即用的共享实体。

您需要执行以下步骤:

  1. 将实体类移动到单独的 Contract 类库中。确保 [DataContract][DataMember]属性到位。
  2. 将对 Contract 项目的引用添加到 ClientServer 项目。
  3. 生成服务引用。检查是否选中了“在契约(Contract)程序集中重用类型”。单击添加服务引用对话框中的“高级...”按钮。
  4. 您的代理类将引用 Contract 项目中描述的类型。

关于c# - 如何在客户端使用自定义类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954198/

相关文章:

c# - 在新的空 DataTable 上使用 "using"是一种好习惯吗?

c# - 使用 Asp.Net Core 强制语言环境

.net - "Or"等价于 LinqWhere() lambda 表达式

asp.net-mvc - WCF客户端实例化

c# - 如果我不分配它,类的实例是否保留在内存中?

c# - 如何将媒体属性添加到 ASP.NET WebResource.axd Http 处理程序的 CSS LINK html 标记

c# - Xamarin.Forms 文本转语音

c# - ASP.NET - 在 session 变量中存储类 - 它是如何工作的(内存)?

WCF + web api + 无法建立连接,因为目标机器主动拒绝它 x.x.x.x :443

WCF错误: Relative end point addresses