使用我的自定义界面的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);
答案 0 :(得分:1)
尽管你有可疑的警告,你可以做一个明确的演员。实际上,CreateChannel()签名返回服务的接口类型,但也继承了木材下的IChannel接口。
这是有道理的,因为该方法不能明显返回2种类型,允许直接使用您的服务。
这是一个实现选择,它可能已经返回,比方说,public interface IChannel<T> : IChannel { T Instance {get;} }
答案 1 :(得分:0)
您可以使用ICommunicationObject
进行关闭或中止 - 我会一直这样做。
只需将您的电话改为:
ProperlyDisposeChannel((ICommunicationObject)clientInterface);
它将按预期工作。