返回IDisposable对象的服务

本文关键字:服务 对象 IDisposable 返回 | 更新日期: 2023-09-27 18:20:42

好吧,所以…我正在处理一个项目,该项目试图实现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,所以我认为这是服务的问题。有没有我们需要点的Ts,或者我们需要交叉的I's,或者这是可行的?`FactoryService代码如下所示:使用Cloud.Library;

[ServiceContract]
public interface FactoryService {
    [OperationContract]
    LibraryFactory CreateLibraryFactory(string applicationId);
    [OperationContract]
    ErrorWatcher CreateErrorWatcher(LibraryFactory factory, string eventURI);
}

`

感谢所有线索。

返回IDisposable对象的服务

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

然而,重要的是,在使用一次性对象的情况下,在客户端上调用Dispose以使其在服务器端调用Dispose通常没有多大意义,因为服务器端对象的生存期仅限于单个方法调用。

这意味着,当您在客户端调用Dispose时,服务器会在新调用的生存期内为服务器端对象创建一个新的实例,并在其上调用Dispose

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)
{
...
}