C# 未调用DataContractResolver
我正在调试一个WCF问题,其中未调用自定义的C# 未调用DataContractResolver,c#,wcf,datacontractserializer,C#,Wcf,Datacontractserializer,我正在调试一个WCF问题,其中未调用自定义的DataContractResolver。我们正在自托管wcf服务,并创建一个ServiceHost,如下所示: private static ServiceHost GetServiceHost(DataContractResolver dataContractResolver, Binding binding, string address) { var serviceHost = new ServiceHost(t
DataContractResolver
。我们正在自托管wcf服务,并创建一个ServiceHost
,如下所示:
private static ServiceHost GetServiceHost(DataContractResolver dataContractResolver, Binding binding, string address)
{
var serviceHost = new ServiceHost(typeof(ServiceImpl));
var endpoint = serviceHost.AddServiceEndpoint((typeof(IServiceInterface)), binding, address);
foreach (var operation in endpoint.Contract.Operations)
operation.Behaviors.Find<DataContractSerializerOperationBehavior>().DataContractResolver = dataContractResolver;
return serviceHost;
}
private static IServiceInterface GetChannel(DataContractResolver dataContractResolver, Binding binding, EndpointAddress endpointAddress)
{
var channelFactory = new DuplexChannelFactory<IServiceInterface>(new CallbackObject(), binding, endpointAddress);
foreach (var operation in channelFactory.Endpoint.Contract.Operations)
operation.Behaviors.Find<DataContractSerializerOperationBehavior>().DataContractResolver = dataContractResolver;
return channelFactory.CreateChannel();
}
私有静态ServiceHost GetServiceHost(DataContractResolver DataContractResolver,绑定绑定,字符串地址)
{
var serviceHost=新serviceHost(typeof(serviceinpl));
var endpoint=serviceHost.AddServiceEndpoint((typeof(IServiceInterface)),绑定,地址);
foreach(endpoint.Contract.Operations中的var操作)
operation.Behaviors.Find().DataContractResolver=DataContractResolver;
返回服务主机;
}
我已经附加了一个调试器,并检查了行为设置是否正确。我们创建的客户端如下所示:
private static ServiceHost GetServiceHost(DataContractResolver dataContractResolver, Binding binding, string address)
{
var serviceHost = new ServiceHost(typeof(ServiceImpl));
var endpoint = serviceHost.AddServiceEndpoint((typeof(IServiceInterface)), binding, address);
foreach (var operation in endpoint.Contract.Operations)
operation.Behaviors.Find<DataContractSerializerOperationBehavior>().DataContractResolver = dataContractResolver;
return serviceHost;
}
private static IServiceInterface GetChannel(DataContractResolver dataContractResolver, Binding binding, EndpointAddress endpointAddress)
{
var channelFactory = new DuplexChannelFactory<IServiceInterface>(new CallbackObject(), binding, endpointAddress);
foreach (var operation in channelFactory.Endpoint.Contract.Operations)
operation.Behaviors.Find<DataContractSerializerOperationBehavior>().DataContractResolver = dataContractResolver;
return channelFactory.CreateChannel();
}
专用静态IServiceInterface GetChannel(DataContractResolver DataContractResolver、绑定绑定、EndpointAddress EndpointAddress)
{
var channelFactory=new DuplexChannelFactory(new CallbackObject(),binding,endpointAddress);
foreach(channelFactory.Endpoint.Contract.Operations中的var操作)
operation.Behaviors.Find().DataContractResolver=DataContractResolver;
返回channelFactory.CreateChannel();
}
在这里,行为也被正确地附加。但是,当我从创建的通道调用时,不会调用我的dataContractResolver
(通过断点、Console.WriteLine
检查,甚至引发异常)。我将我的方法与MSDN文档和几篇博客文章进行了比较,但不明白为什么它不起作用。我错过了什么
我创建了一个最小的示例解决方案,可以从gist下载。要点只包含文件。在我的解决方案中,它们被分为三个不同的项目,服务器(控制台应用程序)、客户端(控制台应用程序)和公共(类库),如它们的名称空间所示
编辑:
我注意到,对于任何类型为
object
的DataMember
属性,都会调用解析器。它仍然不能在整个合同类型中运行,尽管,我已经用一个最小的解决方案重新创建了这个问题,如果需要的话我可以发布,但至少在Meta上的讨论表明这是一个不好的做法?可能会将其作为要点加载到github上?@StuartLC:好主意,谢谢。将把要点编辑成问题