问题标签 [realproxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1098 浏览

c# - 使用 ChannelFactory 创建的通道如何转换为 ICommunicationObject?

我想知道使用 ChannelFactory 创建的 T 通道如何转换为 ICommunicationObject?

我问这个的原因是因为我开始编写一个简单的 ChannelProxy 来管理故障状态,并自动重新创建另一个通道。当我通过 GetTransparentProxy() 获取我的接口实例时,我无法将其转换为 ICommunicationObject。我认为我的构造函数应该覆盖 base(typeof(T+ICommunicationObject)) 而不仅仅是 base(typeof(T))... 但是如何?

这是我的源代码:未最终确定,未完全评论或测试;)

0 投票
0 回答
842 浏览

c# - 如何从 RealProxy 获取 ServiceChannelProxy 或 ServiceChannel

我想访问频道的状态。我收到了包含 RealProxy(rp) 的 __TransparentProxy。我可以使用这个函数 GetRealProxy() 访问它

但是,我仍然无法从 Real 代理获取状态。我需要从 realproxy 获取 ServiceChannel 并访问状态。只需将其转换为 IServiceChannel 就会返回 null。

((System.ServiceModel.Channels.CommunicationObject)(((System.ServiceModel.Channels.ServiceChannelProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(connectionManager.transparentProxy)))._rp)).serviceChannel)) 。状态

RealProxy realproxy = System.Runtime.Remoting.RemotingServices.GetRealProxy(connectionManager.transparentProxy);

获得 RealProxy 后,要访问状态,我仍然需要它。

((System.ServiceModel.Channels.CommunicationObject)(((System.ServiceModel.Channels.ServiceChannelProxy)(realproxy)).serviceChannel)).state

有没有办法访问 ServiceChannelProxy 或 ServiceChannel 或 RealProxy 的状态?

谢谢!

0 投票
1 回答
2272 浏览

asp.net-mvc - 处置 WCF 代理的正确方法是什么?

我一直在努力使用 WCF 代理。处置 WCF 代理的正确方法是什么?答案并非微不足道。

System.ServiceModel.ClientBase 违反了微软自己的 Dispose 模式

System.ServiceModel.ClientBase<TChannel> 确实实现IDisposable了,因此必须假定它应该在using-block 中处理或使用。这些是任何一次性用品的最佳做法。但是,该实现是明确的,因此必须将ClientBase实例显式转换为IDisposable,从而使问题变得模糊。

然而,最大的混乱来源是调用出错Dispose()ClientBase实例,甚至是因为它​​们从未打开过而出错的通道,都会导致抛出异常。这不可避免地意味着当堆栈展开时,解释错误的有意义的异常会立即丢失,using范围结束并Dispose()抛出一个无意义的异常,说明您无法处理有故障的通道。

上述行为是对dispose模式的诅咒,该模式指出对象必须能够容忍多次显式调用Dispose(). (请参阅http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx,“ ...允许Dispose(bool)多次调用该方法。该方法可能选择不执行任何操作在第一次通话之后。 ”)

随着控制反转的出现,这种糟糕的实现成为一个真正的问题。IOC 容器(特别是 Ninject)检测IDisposable接口并Dispose()在注入范围结束时显式调用激活的实例。

解决方案:代理 ClientBase 并拦截对 Dispose() 的调用

ClientBase我的解决方案是通过子类化代理System.Runtime.Remoting.Proxies.RealProxy并劫持或拦截对Dispose(). 我的第一个替代品Dispose()是这样的:

(请注意,这_client是对代理目标的类型化引用。)

NetTcpBinding 的问题

起初我以为这已经解决了,但后来我发现了生产中的一个问题:在某些极其难以重现的场景下,我发现使用 a 的通道NetTcpBinding在无故障的情况下没有正确关闭,即使Dispose正在被调用_client.

我有一个 ASP.NET MVC 应用程序,它使用我的代理实现连接到使用NetTcpBinding本地网络上的 WCF 服务,托管在只有一个节点的服务集群上的 Windows NT 服务中。当我对 MVC 应用程序进行负载测试时,WCF 服务(使用端口共享)上的某些端点会在一段时间后停止响应。

我努力重现这一点:在两台开发人员机器之间跨 LAN 运行的相同组件运行良好;一个控制台应用程序锤击真正的 WCF 端点(在暂存服务集群上运行),每个工作中有许多进程和许多线程;在登台服务器上配置 MVC 应用程序以连接到负载下工作的开发人员机器上的端点;在开发人员的机器上运行 MVC 应用程序并连接到暂存 WCF 端点有效。然而,最后一个方案只适用于 IIS Express,这是一个突破。在开发人员机器上的全脂 IIS 下对 MVC 应用程序进行负载测试时,端点将被占用,连接到暂存服务集群。

解决方案:关闭通道

在未能理解问题并阅读了许多 MSDN 页面和其他声称该问题根本不存在的资源之后,我尝试了一个远射并将我Dispose()的解决方法更改为...

...并且该问题在所有测试设置中以及在暂存环境中的负载下都不再发生!

为什么?

谁能解释可能发生了什么以及为什么Channel在调用之前明确关闭Dispose()解决了它?据我所知,这不应该是必要的。

最后,我回到开头的问题:Dispose WCF Proxy 的正确方法是什么?我的替代品是否Dispose()足够?

0 投票
1 回答
65 浏览

c# - 在服务接口上调用 GetType 会导致调用?

我有几个服务的非常基本的界面。做类似的事情:

在传入从 IService 继承的远程服务实例时,会触发 RealProxy Invoke 方法。

为什么?

0 投票
1 回答
1040 浏览

c# - 从服务合同的 RealProxy 中抛出 WCF 故障异常

我有一个带有 WCF 后端和 UWP 前端的 C# 应用程序。我有一项服务实施我的服务合同。如果我在服务上捕获异常并将它们作为故障异常重新抛出,一切都会按预期工作。

现在我试图通过使用 RealProxy 的实例包装服务调用并从代理中抛出我的故障异常来清理我的服务代码。不幸的是,现在当服务引发异常时,我的客户端会收到带有以下消息的异常:

“服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。”

我有以下服务合同:

通过以下实现:

我的 WCF 服务主机有以下配置,在客户端有相应的配置。

现在,我创建了一个代理:

(感谢@bradmo 的想法。)

动态创建代理类

我使用代理作为我的服务:

在没有代理的情况下抛出错误异常可以正常工作,并且在没有异常时代理可以正常工作,但是当我使用代理包装异常时,我在客户端收到以下错误:

“服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。”

0 投票
2 回答
4791 浏览

c# - 如何将现有对象实例包装到 DispatchProxy 中?

我正在寻找RealProxy.NET Core 中的替代品,这个问题将我转发到DispatchProxy.

它有简单的 API,但不清楚如何将现有对象包装到代理中。
例如,有这个接口:

这个实现:

如何得到我想要的?

由于DispatchProxy后代必须有无参数构造函数,我唯一的想法是发明一些方法,如下所示:

并以这种方式使用它:

这是正确的方法吗?

0 投票
0 回答
111 浏览

c# - 尝试在 C# 中破坏管道时的真正代理实现问题

AuthenticationProxy.cs

动态代理.cs

我已将两种方法声明为 -int GetCustomer(T entity);double GetBalance(T entity);

在管道中添加方法为

现在我使用装饰器调用我的客户方法

上述方法具有不同的返回类型,如 int 和 string。
当用户未在 AuthenticationProxy 类中进行身份验证时,它返回对象为return new ReturnMessage(-1, null, 0, methodCall.LogicalCallContext, methodCall);(Authentication.cs 调用方法)

decorated.GetCustomer(1);调用已成功,返回类型匹配为int. 但是decorated.GetBalance(1);,抛出InvalidCastException异常作为其异常double返回类型值。

那么如何解决这个问题呢?我想让它通用,这样就不应该有返回类型问题。

0 投票
1 回答
484 浏览

c# - 将 RemotingProxy 的 __TransparentProxy 包装在另一个 Proxy 中会抛出 RemotingException

目标

我有几个接口和一些为这些接口提供实现的 dll。我想将实现加载到一个新的 AppDomain 中(这样我以后可以卸载 dll)并在新的 AppDomain 中实例化实现,然后使用客户端(这里是默认的 AppDomain)代理来包装实际的实现对象。目标是创建ClientProxy一次这些实例并在不将实现程序集加载到默认 AppDomain 时更改它们的实际实现。

问题

当调用 ClientProxy __TransparentProxy 对象上的方法时,该对象将另一个 ClientProxy 作为参数,我得到以下异常:

System.Runtime.Remoting.RemotingException: 'The argument type 'System.MarshalByRefObject' cannot be converted into parameter type 'IData'.'

有内部异常:

无效转换异常:Object must implement IConvertible.

当传递直接从服务器 AppDomain 获得的 __TransparentProxy 时,ClientProxy 工作。

设置

可克隆自:https ://github.com/mailgerigk/remoting

接口:

_impl.dll 中的接口 Impl:

服务器端 AssemblyLoader:

客户端代理:

主要的:

0 投票
1 回答
25 浏览

c# - C# RealProxy: for chained methods not working logging (Fluent interface pattern)

Why not working logging for chained methods, but if the same methods call via the saved instance, logging for ones work fine

Gist snippet

0 投票
1 回答
247 浏览

c# - C# - 允许继承但禁止直接使用构造函数

我想允许继承,但禁止直接构造任何继承的类。相反,我想强制使用自定义方法New()

目标是确保继承类的每个实例都是其自身的透明代理。

在这种情况下,不可能创建构造函数privateinternal. 否则,您不能再从程序集之外的类继承。

有什么优雅的方法可以解决这个问题吗?我目前的解决方案: