Wcf服务类公开的helper类中的调用方法

时间:2009-10-25 17:29:22

标签: c# wcf methods

简而言之:尝试为在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);

我错过了什么(显然)......?

谢谢你, 莱因哈德

2 个答案:

答案 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为您创建客户端代理),因为您需要引用它共享契约汇编并直接使用其类型(而不是创建客户端类)。

马克