1

[编辑] 我现在已经在客户端和 OnDeserializing() 和 OnDeserialized() 方法中使用构造函数和调用代码编辑了 D。

我有一个 WCF 服务(通过命名管道)和一个客户端。我需要传递一个对象(最好是该对象的引用)作为我的 OperationContract 的参数。

[DataContract]
public class D
{
    [DataMember] 
    public int Id;

    [DataMember] 
    public string StrId;

    //...


    public D(int id, string strid)
    {
        Id = id;
        StrId = strid;
        //...
    }

    [OnDeserialized]
    void OnDeserialized(StreamingContext strmCtx)
    {
    } // breakpoint here (1)

    [OnDeserializing]
    void OnDeserializing(StreamingContext strmCtx)
    {
    } // breakpoint here (2)

}

这是服务合同:

[ServiceContract]
public interface ICalc
{
    [OperationContract]
    int Calculate(string date, int count);

    // d is input of this method, and count and array are outputs.
    [OperationContract]
    int getArray(ref int count, ref int[] array, D d);
}

这是我调用 getArray 的客户端代码:

proxy.getArray(ref myCount, ref myIntArray, new D(source))

我也试过这个:

D d = new D(source)
proxy.getArray(ref myCount, ref myIntArray, d)

显然这并没有改变任何东西,在这两种情况下,当我在服务代码(getArray 方法的代码)中收到 d 时,它的所有字段都是空的。这是为什么?有什么我想念的吗?

我知道(使用启用跟踪并查看传输层的消息)字段的传输层值正在在线上正确传输。我还向对象添加了 OnDeserialized() 和 OnDeserializing() 方法,以便我可以在断点 (1) 和 (2) 处放置一个断点,所有字段都为空?!实际上根本没有调用对象设置器!

我的想法在这里用完了....

4

4 回答 4

5

WCF 是面向数据的(序列化的 xml),而不是面向对象的。那是行不通的!

您的服务运营:

[OperationContract]
int getArray(ref int count, ref int[] array, D d);

将返回 int 的数据值。如果您想获取 int 值和数组值,我建议您为它创建一个 [DataContract] ,包含这两个值。这样,它们将作为数据传递给客户端。

使用 (ref int[]) 调用服务操作不会产生任何影响。

使用一些代码更新:对不起,但我无法发现您的错误。这是您可以比较的小示例(有效)。如果您仍然无法修复错误,我建议您发布完整的代码和配置。

using System.Runtime.Serialization;
using System.ServiceModel;

namespace WcfService2
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(InputData value);
    }

    [DataContract]
    public class InputData
    {
        [DataMember]
        public int[] Array { get; set; }
        [DataMember]
        public D SomeStuff { get; set; }
    }

    [DataContract]
    public class D
    {
        [DataMember]
        public int Id { get; set; }
    }
}

using System;

namespace WcfService2
{
    public class Service1 : IService1
    {
        public string GetData(InputData data)
        {
            if (data.Array == null || data.SomeStuff == null)
                throw new NullReferenceException();
            return "OK!";
        }
    }
}

using ConsoleApplication9.ServiceReference;
using System;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            var proxy = new Service1Client();
            var request = new InputData
                {
                    Array = new int[] {1, 2, 3},
                    SomeStuff = new D {Id = 42}
                };
            Console.WriteLine(proxy.GetData(request));
            Console.ReadKey();
        }
    }
}
于 2013-02-19T13:00:28.390 回答
1

您是否有默认构造函数,因为如果没有,WCF 将无法理解它。

此外 -ref int[] array数组无论如何都作为引用类型传递。

于 2013-02-19T13:38:53.637 回答
0

在将一些参数分组到 DataContract 类后,我遇到了同样的问题。

我实际上有两个客户端,一个使用与服务器共享的接口程序集工作得很好。使用 ServiceContract 和 DataContract 的代码副本的另一个客户端无法正常工作,并且我的 DataContract 参数服务器端的所有成员都是 0 或 null,如上所述。

问题似乎是由于我将 DataContract 放入客户端的命名空间。我负责将我的 DataContract 放在与来自主客户端程序集的名称空间相同的名称空间中,这解决了我的问题。事实上,除了回调类之外,我将所有合约类都放在同一个命名空间中。所以也许这不仅仅是 DataContract 的问题。虽然在不使用 DataContract 时工作正常,但我想这是唯一导致问题的原因。

希望这是有道理的。

于 2014-08-22T20:45:13.373 回答
0

感谢您的所有帮助和回复。最后,我解决了这个问题。一旦我将 D 放在它自己的程序集中并从服务和客户端都引用它,它就开始工作了。

于 2013-02-20T12:05:22.043 回答