简而言之:尝试为在web服务器上调用存储过程的winform-app编写wcf服务。 到目前为止没有问题 - 我的服务公开方法“execStp(string nameOfStoredProcedure,stpParamList parameterList)”
[OperationContract]
int execStp(string stpName, srsWcfLib.Utilities.stpParamList paramList);
其中stpParamList是另一个持有第三类stpParams的类(它基本上包含一个SqlParameter的名称/值对
要在列表中添加参数,我在第二个类中编写了一个方法
public void addParameter(string ParamName, object ParamValue)
{
this._Parameters.Add(new stpParam(ParamName, ParamValue));
}
List<stpParam> _Parameters = new List<stpParam>();
[DataMember]
public List<stpParam> Parameters
{
get { return _Parameters; }
set { _Parameters = value; }
}
在win-app中实例化List-class
stpParamList stpParams = new stpParamList();
我可以访问stpParams.Parameters
,但不能访问stpParams.addParameter (name, value);
我错过了什么(显然)......?
谢谢你, 莱因哈德
答案 0 :(得分:3)
WCF只会将属性带到客户端,而不是函数。我忘记了他们使用的术语,但它基本上只是一个被发送的属性/字段转储。
要解决此问题,请在客户端中引用相同的Entity库,并在“configure WCF Service”下检查该库的“重用引用”。
答案 1 :(得分:2)
Erich已经解决了问题:WCF是基于 MESSAGE 的传输系统,例如:您将传输对象的序列化消息。具有任何附加功能的服务器端对象将被序列化为XML或二进制格式,通过线路发送到客户端。
然而,客户端只有您的服务公开的XSD(XML Schema)文件 - 它将创建一个客户端类,它在线上具有相同的“数据签名” - 即相同的字段,由相同的名称和类型 - 但它不能神奇地重新创建服务器端代码所具有的任何功能和/或方法。它所能做的就是将消息(文本或二进制)反序列化为类的仅数据表示形式。
这不是错误或绑定问题 - 这是WCF的基本设计选择 - 客户端和服务器之间唯一的连接是序列化消息 - 可以用XML模式表示的任何东西。它会愉快地序列化和反序列化数据 - 但它不能移动代码/行为。您是 NOT 通过引用传递实际对象,就像使用普通函数调用一样--WCF运行时将您的参数序列化为XML并将其发送到。
现在,如果您控制电线的两端,例如客户端和服务器都有一种解决方法,它违反了SOA原则(但它可能很有用)。如果您将服务合同和数据合同放入单独的程序集Contracts.dll
(类库),然后从服务器端和客户端引用它,您实际上可以实际共享公共.NET类型{{ 1}}具有所有功能。但是,在这些情况下,您需要在客户端进行更多的工作,并在代码中手动实例化您的客户端代理(而不是让Visual Studio或svcutil为您创建客户端代理),因为您需要引用它共享契约汇编并直接使用其类型(而不是创建客户端类)。
马克