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]时会出现这种情况吗?
答案 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>();