2012-02-20 65 views
2

我目前正在嘗試創建一個調用WCF SOAP服務的REST代理,我試圖讓一個通道發送消息通過。我知道我需要使用ChannelFactory,但我沒有該服務的接口。有沒有我可以傳遞的默認值?是否有另一種打包郵件的方式?ChannelFactory <T> without interface

當我說消息時,我的意思是來自ServiceModels.Channels.Message。

我很新,所以任何幫助,將不勝感激。

+1

您的Web服務不能既是[基於REST *和*使用SOAP] (http://geeknizer.com/rest-vs-soap-using-http-choosing-the-right-webservice-protocol)。哪一個? – 2012-02-20 19:33:34

+0

這就是爲什麼它的代理,它需要一個休息的呼叫,從其餘的調用中拉出一個參數,將它打包爲肥皂信息,將它發送到肥皂服務,得到響應,解析它,並通過其餘的服務 – SmashCode 2012-02-20 19:42:07

+0

我明白了。我誤解了* proxy *這個詞,我以爲你的意思是客戶端代理:)是否缺少SOAP服務的接口? – 2012-02-20 19:45:26

回答

5

您可以generate a WCF client從以下兩種方式之一WSDL服務合同:

無論哪種方式會產生.NET類與服務協定公開的類型相對應,以及可用於調用服務操作的WCF client proxy class

try 
{ 
    var client = new MyServiceClient(); 
    client.DoSomething(); 
    client.Close(); 
} 
catch 
{ 
    if (client != null) 
    { 
     client.Abort(); 
    } 
} 

如果你喜歡使用較低級別ChannelFactory API,你應該使用產生IClientChannel接口來代替:

try 
{ 
    var factory = new ChannelFactory<MyServiceChannel>(); 
    var client = factory.CreateChannel(); 
    client.DoSomething(); 
    client.Close(); 
} 
catch 
{ 
    if (client != null) 
    { 
     client.Abort(); 
    } 
} 
+0

謝謝,我最終從服務器訪問了源代碼,只是複製了我需要的接口,但是如果我只有wsdl,我也會接受這一點,但這也能解決問題。謝謝。 – SmashCode 2012-02-20 20:56:00

+0

@SmashCode我明白了。我想你在你的一個評論中說過你確實有WSDL合約。無論如何,我很高興我可以幫助:) – 2012-02-20 21:02:13

+0

我很奇怪地說了一句那個評論,Enrico。我確實擁有WSDL,但是現在我擁有WSDL和源代碼,所以我只使用源代替WSDL,但如果我只有WSDL而不是源代碼,那麼您的答案就可以工作。 – SmashCode 2012-02-20 21:10:39

2

ChannelFactory.CreateChannel創建實現所提供的接口的對象並且IClientChannel。該界面必須與服務匹配。

您不需要與服務使用相同的DLL。您可以創建自己的界面以匹配服務的定義。在ServiceContract屬性中,設置名稱和名稱空間以匹配服務的名稱和名稱空間。

+0

有沒有什麼辦法可以從wsdl自動生成這個? – SmashCode 2012-02-20 19:47:21

+0

@SmashCode是的,使用Visual Studio中的** Add Service Reference **對話框或** svcutil **命令行實用程序。 – 2012-02-20 20:26:39

相關問題