返回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
。当您创建它的代理以在客户端使用该代理时,该代理将反映所有方法,但没有接口。从技术上讲,这意味着尽管你的类在服务器上是可丢弃的,但客户端的代理默认情况下不会实现这个接口。您可以为客户端手动将接口添加到代理中。
然而,重要的是,在使用一次性对象的情况下,在客户端上调用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)
{
...
}