C# 返回IDisposable对象的服务?
好吧,那么。。。我有一个项目,我正在努力实现一个WCF(.SVC)服务来返回一个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,
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)
{
...
}