3

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

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 识别为有效关键字。我可以解决 State 并转到 System.Activities.Debugger 这对我来说似乎根本不正确,而其他人根本无法解决。

我已经包含了 System.ServiceModel、System.ServiceModel.Web 和 System.ServiceModel.Channels,这些似乎并不能解决它。

所以我的问题是:

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

任何帮助表示赞赏。

更新

仅供参考 - 我想做的是如下所示:

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

2 回答 2

2

您是否可能复制了我的 dispose 实现

在这种情况下,它应该作为someServiceClient由 Visual Studio 中的“添加服务引用”命令生成的类的部分添加。它不打算与ChannelFactory<T>类一起使用。

可能有可能制定类似的解决方案,ChannelFactory<T>但代码可能不会(正如您发现的那样)与 Wcf 客户端代理(继承自ClientBase<T>)以外的任何其他东西一起工作。

于 2013-11-14T10:58:31.100 回答
0
  1. 从客户端处理服务是一个错误的想法。因为您无法控制何时处置您的服务。正确的方法是在您要关闭服务时从服务器端处理它。
  2. State属性属于IClientChannel接口。所以你可以这样使用它:((IClientChannel)proxy).State
于 2013-11-14T11:12:25.540 回答