Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wcf服务类公开的帮助器类中的调用方法_C#_Wcf_Methods - Fatal编程技术网

C# wcf服务类公开的帮助器类中的调用方法

C# wcf服务类公开的帮助器类中的调用方法,c#,wcf,methods,C#,Wcf,Methods,简而言之:尝试为调用Web服务器上存储过程的winform应用程序编写wcf服务。 到目前为止没有问题-我的服务公开了方法“execStp(StringNameofStoredProcedure,stpParamList参数列表)” 其中stpParamList是第三个类stpParams的另一个类(它基本上保存一个SqlParameter的名称/值对) 为了向列表中添加参数,我在第二个类中编写了一个方法 public void addParameter(string ParamName, ob

简而言之:尝试为调用Web服务器上存储过程的winform应用程序编写wcf服务。 到目前为止没有问题-我的服务公开了方法“execStp(StringNameofStoredProcedure,stpParamList参数列表)”

其中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; }
    }
我可以访问
stParams.Parameters
,但不能访问
stParams.addParameter(名称、值);

我(显然)遗漏了什么

谢谢,,
Reinhard

WCF只将属性传递给客户端,而不是函数。我忘记了它们使用的术语,但它基本上只是通过发送的属性/字段转储


要解决这个问题,请在客户端中引用相同的实体库,并在“配置WCF服务”下选中该库的“重用引用”。

WCF只将属性带到客户端,而不是函数。我忘记了它们使用的术语,但它基本上只是通过发送的属性/字段转储


要解决此问题,请在客户端中引用相同的实体库,并在“配置WCF服务”下选中“重用引用”对于该库。

Erich已经解决了这个问题:WCF是一个基于消息的传输系统,例如,您将传输对象的序列化消息。带有任何附加函数的服务器端对象将序列化为XML或二进制格式,通过网络发送到客户端

但是,客户机只有由您的服务公开的XSD(XML模式)文件可供使用-它将创建一个具有相同“数据签名”的客户机端类在网络上-即相同的字段、相同的名称和类型-但它无法神奇地重新创建服务器端代码拥有的任何函数和/或方法。它所能做的只是将消息(文本或二进制)反序列化回类的仅数据表示形式

这不是绑定的错误或问题-这是WCF的基本设计选择-客户端和服务器之间的唯一连接是序列化消息-可以在XML模式中表示的任何内容。它将愉快地序列化和反序列化数据-但它无法在整个过程中移动代码/行为。您是而不是传递像普通函数调用一样,通过引用调用实际对象-WCF运行时将您的参数序列化为XML并发送给其他用户

现在,如果您确实控制了这条线路的两端,例如客户端和服务器,那么有一种方法可以解决这一问题,它有点违反SOA原则(但它可能是有用的)。如果您将服务契约和数据契约放入一个单独的程序集
contracts.dll
(类库),然后从服务器端和客户端引用它,您实际上可以共享公共.NET类型
srsWcfLib.Utilities.stpParamList
及其所有功能。但是,在这种情况下,您需要在客户端做更多的工作,并在代码中手动实例化您的客户端代理(而不是让Visual Studio或svcutil为您创建客户机代理),因为您需要引用该共享契约程序集并直接使用其类型(而不是创建客户端类)


Marc

Erich已经解决了这个问题: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();