缺少 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

EndpointDispatcher 的 ContractFilter 不匹配(错误处理)

C ++ OpenGL大网格缺少三角形