2009-11-13 33 views
11

我想在.NET 3.5中構建一個支持SOAP的C#服務,並顯示WSDL和REST。使單個WCF服務同時支持SOAP,REST和WSDL

SOAP服務和WSDL生成很容易使用ServiceHostBasicHttpBinding類。得到這個工作,客戶很高興。

因爲SOAP調用所有使用的簡單參數,所以客戶端開發人員爲某些命令請求了一個REST接口。因此,我將ServiceHost類更改爲WebServiceHost,添加了必要的WebInvokeWebGet屬性,添加了WebHttpBinding類,並且賓果 - REST和SOAP都在使用一種服務。很酷,改變一個界面,REST和SOAP都得到了新的東西。

但是有一個問題 - WSDL不再生成。我無法瀏覽到http://server/service?wsdl並獲取WSDL文件。檢查MSDN文檔,似乎是默認WebServiceHost的行爲。

問題:我可以重寫此行爲以便可以獲取WSDL嗎?不必像以前那樣使用相同的URL - 它可以更改 - 但我只需要有一些URL可用於爲這些SOAP開發人員獲取WSDL。

+0

你好賈森,我很想知道你是否仍在使用這種方法,以及它是如何工作或不爲你工作的。你是否發現你必須複製支持兩者的任何方法(核心邏輯)? – schmoopy 2012-01-26 20:08:22

+0

我只需要創建兩個端點併爲每個命令添加一個額外的屬性。 – 2012-01-26 20:28:02

+0

解決方案的類似問題。 http://social.msdn.microsoft.com/Forums/en/wcf/thread/845d0bbd-52b4-420f-bf06-793d53ef93ba – maciejW 2010-10-17 01:47:56

回答

4

當你說「添加一個WebHttpBinding類」時,它聽起來像你在代碼中做了很多配置,而不是在配置文件中。

如果是這種情況,您可以嘗試將配置移動到配置文件。然後爲一個REST和一個SOAP創建2個端點,包含2個不同的地址和綁定。

+0

我在代碼中完成所有配置,而不是配置文件。 一個解決方案是使用兩個端點 - 並且該解決方案確實工作得很好。我希望能夠使用單個端點;單個端口和根URL。 – 2009-11-13 20:06:11

+1

我不認爲你可以從WebHttpBinding端點獲取WSDL。 – 2009-11-13 20:09:18

4

但是有一個問題 - WSDL不再生成 。我無法瀏覽到 http://server/service?wsdl並獲取 WSDL文件。檢查MSDN文檔 ,這似乎是 默認WebServiceHost的行爲。

是 - 這是REST的缺點之一 - 沒有更多的WSDL,沒有更多的機器可讀的服務描述。您需要希望服務提供商能夠爲您提供可用的最新文檔。

REST期間沒有WSDL。無法打開或任何 - 它不存在。

目前正在做一些努力來提供類似的東西 - 稱爲WADL(Web應用程序描述語言),但據我所知,它通過任何方式還遠未達到既定標準。另見:Do we need WADL

+0

我可以理解REST沒有WSDL,但請記住該服務同時處理REST和SOAP請求。只是SOAP客戶端不能再請求WSDL。目標是擁有一個單一的監聽端口的服務,它可以爲REST,SOAP和WSDL提供服務,所有服務都基於URL路徑。 – 2009-11-16 15:53:51

0

大約在2007年,WSDL v2.0應該能夠描述RESTful服務。我發現使用.Net v4.0中的WCF,從純粹的RESTful服務生成的WDSL是無效的(WSDL v1.0?)。

我創建了一個類似的項目,一個公開SOAP和REST風格的端點,並啓用此通過,像你一樣,修改界面,例如:

// Get all Categories - complex object response 
    [OperationContract]        // categories 
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories")] 
    CategoryCollection GetAllCategories();   // SubSonic object 
    [OperationContract]        // categories - respond with a JSON object 
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories.JSON")] 
    CategoryCollection GetAllCategoriesJSON();  // SubSonic object 

一個需要注意的情況是,所有的輸入參數,現在必須對於所有SOAP請求都是字符串類型。

有沒有辦法解決這個問題?

+0

有沒有辦法公開在SOAP和REST中完全相同的方法,而不是爲每個舊的soap方法添加新的方法? – 2015-11-11 03:52:02