WCF ChannelFactory 转换接口到 IClientChannel 可疑转换

Posted

技术标签:

【中文标题】WCF ChannelFactory 转换接口到 IClientChannel 可疑转换【英文标题】:WCF ChannelFactory casting interface to IClientChannel suspisious cast 【发布时间】:2016-12-04 10:01:27 【问题描述】:

使用我的自定义界面的 WCF ChannelFactory CreateChannel 方法 -

ChannelFactory<MyServiceInterface> myFactory= 
new ChannelFactory<MyServiceInterface>(binding,endpoint);

MyServiceInterface clientInterface = myFactory.CreateChannel();

在网上阅读了很多,看起来我想正确关闭我的频道 -

private void ProperlyDisposeChannel(ICommunicationObject comObj)
        
            bool success = false;

            if (comObj == null || comObj.State == CommunicationState.Closed)
            
                return;
            

            try
            
                if (comObj.State != CommunicationState.Faulted)
                
                    comObj.Close();
                    success = true;
                
            
            catch (Exception e)
            
                //optionally log exception
            
            finally
            
                if (!success)
                
                    try
                    
                        comObj.Abort();
                    
                    catch (Exception e)
                    
                        //do not retry to abort, optionally log
                    
                
            
        

所以我试图将我的频道投射到 IClientChannel(或者可能是 IChannel),但 VS 警告我 - 可疑演员表 - 解决方案中没有类型同时继承 MyServiceInterface 和 System.ServiceModel.IClientChannel

我的印象是工厂返回的代理自动实现了IClientChannel。我错了吗?这个警告是关于什么的?我应该将频道投射到什么位置?也许我的 ProperlyDisposeChannel 方法应该接受 IClientChannel 而不是 ICommunicationObject(我更喜欢 ICOmmuminationObject 因为它也适用于其他对象)

所以我正在尝试以下行,这给了我警告 -

ProperlyDisposeChannel((IChannel)clientInterface);

ProperlyDisposeChannel((IClientChannel)clientInterface);

【问题讨论】:

msdn.microsoft.com/en-us/library/ms575250(v=vs.110).aspx - 表示返回工厂创建的 IChannel 类型的 TChannel。所以不确定什么是可疑的...... 你在哪里投射到 IClientChannel? 为了关闭 - 调用 PropertyDisposeChannel((IChannel/IClientChannel)clientInterface)。也会让帖子更清晰 there is no type in the solution that inherits both MyServiceInterface and System.ServiceModel.IClientChannel 这不是真的吗?您的解决方案中是否存在这种类型? C# 编译器对 WCF 一无所知。 WCF 只是一个与其他库一样的库。 @MikeTurner 你看到我的评论了吗?您在此页面上与其他人进行了互动,因此您可能错过了我的问题。 【参考方案1】:

您可以使用 ICommunicationObject 来关闭或中止 - 我一直这样做。

只需将您的呼叫更改为:

ProperlyDisposeChannel((ICommunicationObject)clientInterface);

它会按预期工作。

【讨论】:

谢谢。这给了我与使用 IChannel 相同的可疑演员警告 @MikeTurner - 这很奇怪。我们有一个在层之间使用 WCF 的 n 层应用程序,我们使用完全相同的模式,我从未见过这个警告。 clientInterface 的类型是什么?是MyServiceInterace吗?你能把MyServiceInterface的代码贴出来吗? MyServiceInterface- [ServiceContract] 公共接口 MyServiceInterface [OperationContract 方法... 只是一个没有专门实现 ICommunicationObject 或 IChannel 的普通接口......我需要吗?查看 SOS 评论中的链接 - 看起来返回的对象自动实现了 IChannel 您不需要在合同中实现接口 - WCF 框架会在创建通道时为您执行此操作。 IChannel 实现了ICommunicationObject,所以演员表应该是合法的。也许您的代码中还有其他不那么明显的内容?【参考方案2】:

尽管您收到了可疑警告,但您仍可以进行显式转换。实际上,CreateChannel() 签名返回服务的接口类型,但也继承了木材下的 IChannel 接口。

这是有道理的,因为该方法显然不能返回 2 种类型,从而允许直接使用您的服务。

这是一个实现选择,它可能已经返回,比如说,public interface IChannel&lt;T&gt; : IChannel T Instance get;

【讨论】:

以上是关于WCF ChannelFactory 转换接口到 IClientChannel 可疑转换的主要内容,如果未能解决你的问题,请参考以下文章

WCF,ChannelFactory,“找不到端点元素...”

WCF ChannelFactory 状态属性

带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException / 405 Method not Allowed

WCF ChannelFactory 和连接超时的最佳实践

WCF - 是不是可以使用 HttpListener 或套接字来监听 WCF ChannelFactory

何时在服务参考上使用 WCF ChannelFactory [重复]