C# 返回IDisposable对象的服务?

C# 返回IDisposable对象的服务?,c#,wcf,interface,idisposable,C#,Wcf,Interface,Idisposable,好吧,那么。。。我有一个项目,我正在努力实现一个WCF(.SVC)服务来返回一个IDisposable的对象。我们是这样使用它的: FactoryService client = new FactoryService(); LibraryFactory factory = client.CreateLibraryFactory("Hello Library"); using (IErrorWatcher watcher = client.CreateErrorWatcher(factory,

好吧,那么。。。我有一个项目,我正在努力实现一个WCF(.SVC)服务来返回一个IDisposable的对象。我们是这样使用它的:

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方法触发日志记录。问题是,我们遇到了这样的错误:using语句中使用的类型必须隐式转换为“System.IDisposable”

它正在实现IDisPoble,所以我认为这是服务的一个问题。有没有我们需要点的Ts或者我们需要穿过的I,或者这是可行的? ` FactoryService代码如下所示: 使用Cloud.Library

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

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


感谢所有线索。

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

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


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

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

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

发布您的factoryservice代码。请发布
IErrorWatcher
的签名,它是
接口IErrorWatcher:IDisposeable{…
?准确地说。服务必须以能够在另一端重新创建的方式公开自身(无论是由.NET使用者还是任何其他框架等)。将每个接口和/或基类包含在服务公开的所有内容的引用中将是a)极度臃肿和笨拙,b)对非.NET消费者毫无用处。与我们的架构师协商,这似乎是个问题。他准备将此作为解决方案废弃。有人对如何使其成为ork?包括非.NET用户?欢迎任何和所有想法。如果目标是在客户端有一个一次性对象,您只需添加接口,但没有多大意义,代理没有什么可处理的。如果您想在服务器上处理,但想从客户端控制它,您会遇到麻烦,因为这听起来很棘手如果不是不可能的话。
public abstract class ClientBase<TChannel> : ICommunicationObject, IDisposable where TChannel : class
MySoap my_soap = new MySoapClient(binding, endpoint);
using (my_soap as IDisposable)
{
...
}