2014-09-03 89 views
0

好吧,所以......我有這個項目,我正在努力實現一個WCF(.SVC)服務來返回一個IDisposible對象。我們使用這樣的東西:返回帶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方法來觸發日誌記錄。問題是,我們得到這個錯誤:ErrorWatcher:在using語句中使用的類型必須隱式轉換爲'System.IDisposable'

它正在實現IDisposible,所以我認爲這是服務的問題。有沒有我們需要加點的T或我們需要穿過的點,還是這個可行?工廠服務代碼如下: 使用Cloud.Library;

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

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

`

任何和讚賞的所有線索。

+1

發佈您的工廠服務代碼。 – 2014-09-03 18:10:40

+2

請寄出'IErrorWatcher'簽名,它是'interface IErrorWatcher:IDisposeable {...'? – 2014-09-03 18:23:13

回答

1

我敢打賭,你的班級在服務器處實施了IDisposable。當您創建代理以在客戶端使用代理時,代理將反映所有方法,但不包括的接口。從技術上講,這意味着儘管您的類可以在服務器上使用,但客戶端的代理默認不會實現此接口。您可以手動爲客戶端添加接口到代理。

但是,重要的是,如果是一次性對象,在客戶端調用Dispose使其在服務器對端調用Dispose往往沒有多大意義,因爲服務器端對象的生存期限制在無論如何只需要一個方法。

這意味着,當您在客戶端調用Dispose,服務器創建爲新呼叫的生命週期服務器端對象的新實例,並調用它Dispose

+0

正是。該服務必須以可以在另一端重新創建的方式公開(無論是由.NET消費者還是其他任何框架等)。對於服務公開的所有內容,包含每個接口和/或基類都將是a)非常臃腫和笨重,b)對非.NET消費者無用。 – barrick 2014-09-03 18:54:19

+0

與我們的建築師進行交流,似乎確實存在問題。他準備廢除這個解決方案。有沒有人有任何想法如何使其工作?包括非.NET消費者?開放給任何和所有的想法。 – EDanaII 2014-09-03 21:56:27

+0

如果目標是在客戶端擁有一個可拋棄的對象,那麼您只需添加接口,但沒有多大意義,對代理沒有任何處理。如果你想在服務器上進行處理,但你想從客戶端進行控制,那麼你的時間不好,因爲這聽起來很棘手,如果不是不可能的話。 – 2014-09-04 05:28:21

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