传递List <mytype> </mytype> </t>时,Param List <t>的WCF调用失败

时间:2011-12-01 21:14:47

标签: c# wcf generics

WCF服务接口

[ServiceContract]
public interface ITest
{
    [OperationContract]
    int TestCall(GenericType<MyType> x);

    [OperationContract]
    int TestAnotherCall(GenericType<MyOtherType> x);

}

[DataContract(Name = "GenericType")]
[KnownType(typeof(List<MyType>))]
[KnownType(typeof(List<MyOtherType>))]
public class GenericType<T>
{
    [DataMember]
    public List<T> Data
    {
        get { return data; }
        set { data = value; }
    }
}

WCF服务实施

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Test : ITest
{
    public int TestCall(GenericType<MyType> x)
    {
        return x.Data.Count; 
    }

    public int TestAnotherCall(GenericType<MyOtherType> x)
    {
        return x.Data.Count; 
    }
}

客户

List<MyType> list = from a in ctx.Table
                    select new MyType (a.Field1, a.Field2, a.Field3).ToList(); 

GenericType gt = new GenericType();
gt.Data = list;

using(WCFClient client = new WCFClient())
{
   client.TestCall(gt);
   client.Close();
}

错误:
远程服务器返回了意外响应:(400)错误请求。

如果我将NULL传递给“gt.Data”......它可以正常工作。

注意:

  

当我将鼠标放在gt.Data上时......提示显示为MyType []
  不确定是否预期。

     

经过一番审核后,我注意到客户服务只知道有关   第一个[KnownType]声明,在我的情况下是List。   不了解清单....
  在WCF接口上放置各种[KnownType]时会出现这种情况吗?

3 个答案:

答案 0 :(得分:2)

您需要使用KnownType()属性

来装饰您的通用符号
[DataContract(Name = "GenericType")]
[KnownType(typeof(MyType))]
public class GenericType<T>
{
    [DataMember]
    public List<T> Data
    {
        get { return data; }
        set { data = value; }
    }
}

快速工作示例:

<强>服务

[OperationContract]
GenericType<MyType> GetDataUsingDataContract(GenericType<MyType> composite);

public class Service1 : IService1
{
    public GenericType<MyType> GetDataUsingDataContract(GenericType<MyType> composite)
    {
        composite.Data.First().Stuff = "Test";
        return composite;
    }
}

<强>模型

[DataContract(Name = "GenericType")]
[KnownType(typeof (MyType))]
public class GenericType<T>
{
    [DataMember]
    public List<T> Data { get; set; }
}

public class MyType
{
    public string Stuff { get; set; }
}

<强>客户端

var client = new Service1Client();

var genericType = new GenericType
                        {
                            Data = new[]
                                        {
                                            new MyType(),
                                        }
                        };
var result = client.GetDataUsingDataContract(genericType);
client.Close();

Console.WriteLine(result.Data.First().Stuff);

Console.ReadLine();

此示例是通过添加服务引用而不是使用共享程序集生成的

答案 1 :(得分:1)

您需要为每个可以包含的类赋予GenericType KnownType属性。

例如:

[KnownType(typeof(List<MyType>)]
public class GenericType<T>

答案 2 :(得分:0)

问题可能是您在实例化T时没有为GenericType提供类型。试试这个:

GenericType<MyType> gt = new GenericType<MyType>();

而不是

GenericType gt = new GenericType();

它与您实例化任何其他泛型类时的语法相同。例如,要声明字符串列表(在List<T>中列出...请参阅here),您会说:

List<String> myStrings = new List<String>();