C# wcf服务类公开的帮助器类中的调用方法
简而言之:尝试为调用Web服务器上存储过程的winform应用程序编写wcf服务。 到目前为止没有问题-我的服务公开了方法“execStp(StringNameofStoredProcedure,stpParamList参数列表)” 其中stpParamList是第三个类stpParams的另一个类(它基本上保存一个SqlParameter的名称/值对) 为了向列表中添加参数,我在第二个类中编写了一个方法C# wcf服务类公开的帮助器类中的调用方法,c#,wcf,methods,C#,Wcf,Methods,简而言之:尝试为调用Web服务器上存储过程的winform应用程序编写wcf服务。 到目前为止没有问题-我的服务公开了方法“execStp(StringNameofStoredProcedure,stpParamList参数列表)” 其中stpParamList是第三个类stpParams的另一个类(它基本上保存一个SqlParameter的名称/值对) 为了向列表中添加参数,我在第二个类中编写了一个方法 public void addParameter(string ParamName, ob
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; }
}
我可以访问stParams.Parameters
,但不能访问stParams.addParameter(名称、值);
我(显然)遗漏了什么
谢谢,,
ReinhardWCF只将属性传递给客户端,而不是函数。我忘记了它们使用的术语,但它基本上只是通过发送的属性/字段转储
要解决这个问题,请在客户端中引用相同的实体库,并在“配置WCF服务”下选中该库的“重用引用”。WCF只将属性带到客户端,而不是函数。我忘记了它们使用的术语,但它基本上只是通过发送的属性/字段转储
要解决此问题,请在客户端中引用相同的实体库,并在“配置WCF服务”下选中“重用引用”对于该库。Erich已经解决了这个问题:WCF是一个基于消息的传输系统,例如,您将传输对象的序列化消息。带有任何附加函数的服务器端对象将序列化为XML或二进制格式,通过网络发送到客户端 但是,客户机只有由您的服务公开的XSD(XML模式)文件可供使用-它将创建一个具有相同“数据签名”的客户机端类在网络上-即相同的字段、相同的名称和类型-但它无法神奇地重新创建服务器端代码拥有的任何函数和/或方法。它所能做的只是将消息(文本或二进制)反序列化回类的仅数据表示形式 这不是绑定的错误或问题-这是WCF的基本设计选择-客户端和服务器之间的唯一连接是序列化消息-可以在XML模式中表示的任何内容。它将愉快地序列化和反序列化数据-但它无法在整个过程中移动代码/行为。您是而不是传递像普通函数调用一样,通过引用调用实际对象-WCF运行时将您的参数序列化为XML并发送给其他用户 现在,如果您确实控制了这条线路的两端,例如客户端和服务器,那么有一种方法可以解决这一问题,它有点违反SOA原则(但它可能是有用的)。如果您将服务契约和数据契约放入一个单独的程序集
contracts.dll
(类库),然后从服务器端和客户端引用它,您实际上可以共享公共.NET类型srsWcfLib.Utilities.stpParamList
及其所有功能。但是,在这种情况下,您需要在客户端做更多的工作,并在代码中手动实例化您的客户端代理(而不是让Visual Studio或svcutil为您创建客户机代理),因为您需要引用该共享契约程序集并直接使用其类型(而不是创建客户端类)
MarcErich已经解决了这个问题:WCF是一个基于消息的传输系统,例如,您将传输对象的序列化消息。带有任何附加功能的服务器端对象将被序列化为XML或二进制格式,通过网络发送到客户端 但是,客户机只有由您的服务公开的XSD(XML模式)文件可供使用-它将创建一个具有相同“数据签名”的客户机端类在网络上-即相同的字段、相同的名称和类型-但它无法神奇地重新创建服务器端代码拥有的任何函数和/或方法。它所能做的只是将消息(文本或二进制)反序列化回类的仅数据表示形式 这不是绑定的错误或问题-这是WCF的基本设计选择-客户端和服务器之间的唯一连接是序列化消息-可以在XML模式中表示的任何内容。它将愉快地序列化和反序列化数据-但它无法在整个过程中移动代码/行为。您是而不是传递像普通函数调用一样,通过引用调用实际对象-WCF运行时将您的参数序列化为XML并发送给其他用户 现在,如果您确实控制了这条线路的两端,例如客户端和服务器,那么有一种方法可以解决这一问题,它有点违反SOA原则(但它可能是有用的)。如果您将服务契约和数据契约放入一个单独的程序集
contracts.dll
(类库),然后从服务器端和客户端引用它,您实际上可以共享公共.NET类型srsWcfLib.Utilities.stpParamList
及其所有功能。但是,在这种情况下,您需要在客户端做更多的工作,并在代码中手动实例化您的客户端代理(而不是让Visual Studio或svcutil为您创建客户机代理),因为您需要引用该共享契约程序集并直接使用其类型(而不是创建客户端类)
Marc感谢大家的澄清!正如你们所注意到的,我是WCF新手,但两个答案都很有帮助!Reinhard感谢大家的澄清!正如你们所注意到的,我是WCF新手,但两个答案都很有帮助!Reinhard
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; }
}
stpParamList stpParams = new stpParamList();