我正在调试我的自定义DataContractResolver
未调用的WCF问题。我们自行托管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();
}
此处也正确附加了行为。但是,当我从创建的频道发出呼叫时,我的dataContractResolver
未被调用(使用断点检查,Console.WriteLine
甚至抛出异常)。我将我的方法与MSDN文档和一些博客文章进行了比较,但不明白为什么它不起作用。我错过了什么?
我创建了一个最小的示例解决方案,可以从gist here下载。 要点只包含文件。在我的解决方案中,它们分为三个不同的项目,服务器(控制台应用程序),客户端(控制台应用程序)和公共(类库),如其命名空间所示
修改
我注意到,对于类型为DataMember
的任何object
属性,都会调用解析程序。但是,它仍然没有针对整个合同类型运行,