即使使用KnownType,派生类型上的属性也不会在WCF客户端中反序列化
我有以下几种:即使使用KnownType,派生类型上的属性也不会在WCF客户端中反序列化,wcf,datacontract,known-types,Wcf,Datacontract,Known Types,我有以下几种: public enum MyEnum { Value1, Value2 } [DataContract] public class Configuration { [DataMember] public MyEnum MyValue { get; set; } [DataMember] public Credentials CredentialValues { get; set; } } [DataContract, Known
public enum MyEnum
{
Value1,
Value2
}
[DataContract]
public class Configuration
{
[DataMember]
public MyEnum MyValue { get; set; }
[DataMember]
public Credentials CredentialValues { get; set; }
}
[DataContract, KnownType(typeof(CustomCredentials))]
public class Credentials
{
}
[DataContract]
public class CustomCredentials : Credentials
{
[DataMember]
public string Property1 { get; set; }
[DataMember]
public string Property2 { get; set; }
}
在我的服务接口上,我有一个函数,它将配置实例及其CredentialValues属性设置为一个完全填充的CustomCredentials实例。我没有收到来自客户端或服务器的错误,但是当数据在服务器上被属性序列化并由客户端接收时,CustomCredentials上的属性从来没有值。为了在客户端上正确反序列化这些属性,我需要在这里更改什么
作为参考,客户机和服务器之间的连接是通过NetTcpBinding通过DuplexChannelFactory进行的,使用数据/服务合同项目,该项目由客户机和服务应用程序共享。该服务是自托管的,因此没有需要重新生成的服务代理类型。将此代码与DataContracts一起添加到Contracts项目中
[ServiceContract(Namespace = "http://schemas.platinumray.com/duplex", SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
[OperationContract(IsOneWay = true)]
void GetData();
}
public interface IService1Callback
{
[OperationContract(IsOneWay = true)]
void SetData(Configuration config);
}
创建了服务
public class Service1 : IService1
{
public void GetData()
{
var x = new Configuration()
{
MyValue = MyEnum.Value1,
CredentialValues = new CustomCredentials { Property1 = "Something", Property2 = "Something else" }
};
OperationContext.Current.GetCallbackChannel<IService1Callback>().SetData(x);
}
}
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost( typeof(Service1), new Uri[] { new Uri("net.tcp://localhost:6789") }))
{
host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "Service1");
host.Open();
Console.ReadLine();
host.Close();
}
}
}
所以这实际上在不修改任何数据契约的情况下起作用。。。如果我恢复到双向操作,直接返回配置而不使用回调,则会得到相同的结果
还尝试将凭据抽象化,但无法复制您的问题
我错过了什么吗?我接受并奖励奖金,因为这是我的一个愚蠢错误,与WCF完全无关。谢谢你的帮助,谢谢亚当。在过去,我犯了很多这样的错误,我怀疑情况可能就是这样。很高兴一切都安排好了。你好,一个笨蛋。
public class CallbackHandler : IService1Callback
{
public void SetData(Configuration config)
{
Console.WriteLine(config.CredentialValues.GetType().Name);
Console.WriteLine(((CustomCredentials)config.CredentialValues).Property1);
Console.WriteLine(((CustomCredentials)config.CredentialValues).Property2);
}
}
class Program
{
static void Main(string[] args)
{
// Setup the client
var callbacks = new CallbackHandler();
var endpoint = new EndpointAddress(new Uri("net.tcp://localhost:6789/Service1"));
using (var factory = new DuplexChannelFactory<IService1>(callbacks, new NetTcpBinding(), endpoint))
{
var client = factory.CreateChannel();
client.GetData();
Console.ReadLine();
factory.Close();
}
}
}
CustomCredentials
Something
Something else