繁体   English   中英

为WCF ChannelFactory实现IDisposable <T>

[英]Implementing IDisposable for WCF ChannelFactory<T>

我们有一个Web服务,用于从网站获取请求并从数据库中提取数据以返回到网站。 这一切似乎都很好,但是自从我们开发它以来,一直有一些困扰我的东西。 我从客户端建立与服务的连接的代码如下:

string bindingName = ConfigurationManager.AppSettings["BindingName"];
ChannelFactory<IIntranet> factory = new ChannelFactory<IIntranet>(bindingName);
IIntranet proxy = factory.CreateChannel();

现在,代理公开了我界面中的所有方法,但是它没有做的一件事就是实现IDisposable。 所以经过一些谷歌搜索后,我发现各种人都说我们必须实现界面,我做了如下:

public class Service : IInternet, IIntranet, IDisposable

IDisposable提供Dispose方法,如下所示:

public void Dispose()
{
    Dispose(true);
} 

dispose方法是我从互联网上复制的方法,看起来像:

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        try
        {
            if (State != CommunicationState.Faulted)
            {
                Close();
            }
        }
        finally
        {
            if (State != CommunicationState.Closed)
            {
                Abort();
            }
        }
    }
}

现在我遇到的问题是编译器不会将State,Close或Abort识别为有效关键字。 我可以解决国家问题,它会转到System.Activities.Debugger,这对我来说似乎不对,其他人根本就没有解决。

我已经包含System.ServiceModel,System.ServiceModel.Web和System.ServiceModel.Channels,这些似乎无法解决它。

所以我的问题是:

1)我是否正确地为上述场景实现IDisposable(网站创建服务连接以检索数据)
2)如果是,那么如何解决Disposing方法中的错误?

任何帮助赞赏。

更新

仅供参考 - 我希望做的是以下内容:

using (IIntranet proxy = factory.CreateChannel())
{  
}

您是否复制了我的处置实施

在这种情况下,它意味着添加为visual studio中“add service reference”命令生成的someServiceClient类的部分内容。 它不适用于ChannelFactory<T>类。

也许可以为ChannelFactory<T>创建一个类似的解决方案,但代码可能不会(正如您所知)与Wcf客户端代理(继承自ClientBase<T> )之外的任何其他方式一起工作。

  1. 从客户端部署服务是错误的想法。 因为您无法控制何时处置您的服务。 正确的方法是在要关闭服务时从服务器端部署它。
  2. State属性属于IClientChannel接口。 所以你可以这样使用它: ((IClientChannel)proxy).State

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM