好的,所以......我正在尝试这个项目,试图实现一个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);
}
`
任何和所有线索都表示赞赏。
答案 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)
{
...
}