缺少 EndpointDispatcher 和 ClientRuntime
Posted
技术标签:
【中文标题】缺少 EndpointDispatcher 和 ClientRuntime【英文标题】:EndpointDispatcher and ClientRuntime missing 【发布时间】:2021-11-01 05:35:02 【问题描述】:除了从 EndpointDispatcher 访问 ClientRuntime 之外,还有其他方法吗?
似乎在 .NET 5.0 中,使用 System.ServiceModel 4.8.1,EndpointDispatcher 类是完全空的,只包含一个空构造函数。
我们曾经进行过一些测试来检查 IEndpointBehavior
是否已使用 WCF 正确添加到客户端。
var myEndpointBehavior = new MyEndpointBehavior();
var serviceEndpoint = new ServiceEndpoint(new ContractDescription("localhost"));
var dispatcher = new EndpointDispatcher(new EndpointAddress("http://localhost"), "", ""); // <--- Error because EndpointDispatcher class is totally empty
var clientRuntime = dispatcher.DispatchRuntime.CallbackClientRuntime; // <---- does not exist
clientRuntime.ClientMessageInspectors.Should().HaveCount(0);
myEndpointBehavior.ApplyClientBehavior(serviceEndpoint, clientRuntime);
clientRuntime.ClientMessageInspectors.Should().HaveCount(1);
clientRuntime.ClientMessageInspectors.First().Should().BeOfType<MyEndpointBehaviorMessageInspector>();
有没有办法在 .NET 5.0 中测试同样的行为?
【问题讨论】:
你可以看看:ASP.NET 5 - A Deep Dive into the ASP.NET 5 Runtime和EndpointDispatcher Constructors 您发送的链接都是针对 .NET Framework 的,正如我上面提到的,这曾经在 .NET Framework 中正常工作,但在 .NET Core 和 .NET5.0 中完全改变了。所以这些资源不再适用 【参考方案1】:由于ClientRuntime
的构造函数被隐藏起来,我无法真正访问它,因此我最终使用Activator
来访问ClientRuntime
的私有/内部构造函数。这不是一个优雅的解决方案,但它允许我们测试行为。
var myEndpointBehavior = new MyEndpointBehavior();
var serviceEndpoint = new ServiceEndpoint(new ContractDescription("localhost"));
var clientRuntime = (ClientRuntime) Activator.CreateInstance(typeof(ClientRuntime), BindingFlags.Instance | BindingFlags.NonPublic,
null, new[] serviceEndpoint.Contract.Name, serviceEndpoint.Contract.Namespace , null, null);
clientRuntime.ClientMessageInspectors.Should().HaveCount(0);
myEndpointBehavior.ApplyClientBehavior(serviceEndpoint, clientRuntime);
clientRuntime.ClientMessageInspectors.Should().HaveCount(1);
clientRuntime.ClientMessageInspectors.First().Should().BeOfType<MyEndpointBehaviorMessageInspector>();
【讨论】:
以上是关于缺少 EndpointDispatcher 和 ClientRuntime的主要内容,如果未能解决你的问题,请参考以下文章
EndpointDispatcher 错误处的 WCF ContractFilter 不匹配
由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action '' 的消息。
EndpointDispatcher 的 ContractFilter 不匹配?
EndpointDispatcher 处的 AddressFilter 不匹配 - 带有 To 的 msg