WCF ChannelFactory将IClientChannel转换为可疑的转换

时间:2016-07-29 15:57:33

标签: c# wcf dispose channel channelfactory

使用我的自定义界面的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);

2 个答案:

答案 0 :(得分:1)

尽管你有可疑的警告,你可以做一个明确的演员。实际上,CreateChannel()签名返回服务的接口类型,但也继承了木材下的IChannel接口。

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

这是一个实现选择,它可能已经返回,比方说,public interface IChannel<T> : IChannel { T Instance {get;} }

答案 1 :(得分:0)

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

只需将您的电话改为:

ProperlyDisposeChannel((ICommunicationObject)clientInterface);

它将按预期工作。