返回IDisposable对象的服务?

时间:2014-09-03 18:07:30

标签: c# wcf interface idisposable

好的,所以......我正在尝试这个项目,试图实现一个WCF(.SVC)服务来返回一个具有IDisposible的对象。我们使用这样的东西:

FactoryService client = new FactoryService();

LibraryFactory factory = client.CreateLibraryFactory("Hello Library");

using (IErrorWatcher watcher = client.CreateErrorWatcher(factory, "This is a test, this is only a test...")) 
{
    try 
    {
        int a = 0; int b = 1;
        int c = b / a; //Force errror
    }
    catch (Exception ex) 
    {
        watcher.SetError(ex);
    }
}

我们这样做是为了让Dispose方法可用于触发日志记录。问题是,我们收到此错误:ErrorWatcher:using语句中使用的类型必须可以隐式转换为' System.IDisposable'

它实现了IDisposible,所以我认为这是服务的问题。我们需要点数或者我们需要交叉,或者这是否可行? ` FactoryService代码如下所示:     使用Cloud.Library;

[ServiceContract]
public interface FactoryService {
    [OperationContract]
    LibraryFactory CreateLibraryFactory(string applicationId);

    [OperationContract]
    ErrorWatcher CreateErrorWatcher(LibraryFactory factory, string eventURI);
}

`

任何和所有线索都表示赞赏。

2 个答案:

答案 0 :(得分:1)

我敢打赌,您的班级会在服务器上实施IDisposable 。当您创建它的代理以在客户端使用代理时,代理将反映所有方法,但无接口。从技术上讲,这意味着尽管您的类在服务器上是可丢弃的,但客户端的代理默认情况下不会实现此接口。您可以手动为客户端添加接口到代理。

然而,重要的是,在一次性对象的情况下,在客户端上调用Dispose以使其在服务器对等方上调用Dispose通常不太有意义,因为无论如何,服务器端对象的生命周期仅限于单个方法调用。

这意味着当您在客户端呼叫Dispose时,服务器会在新呼叫的生命周期内为服务器端对象创建新的实例,并调用{{1} } 在上面。

答案 1 :(得分:0)

Soap服务客户端继承自System.ServiceModel.ClientBase:

public partial class MySoapClient : System.ServiceModel.ClientBase<MySoap>, MySoap {..}

ClientBase实现了IDisposable接口:

public abstract class ClientBase<TChannel> : ICommunicationObject, IDisposable where TChannel : class

所以看起来它应该由程序员处理。真的需要吗?我不知道。 我刚刚做了:

MySoap my_soap = new MySoapClient(binding, endpoint);
using (my_soap as IDisposable)
{
...
}