2009-08-11 49 views
15

我只想了解爲什麼我無法在Web服務中使用靜態Web方法?爲什麼受到限制?爲什麼靜態方法不能用作ASMX Web服務中的Web服務操作?

有些身體可以給我簡明的解釋。

+0

順便說一句,你知道微軟現在認爲ASMX網絡服務是「傳統技術」,並且他們已經停止修復那裏的錯誤嗎?你應該使用WCF。 – 2009-08-11 22:49:10

+0

我沒有意識到這一點:(。 – Tarik 2009-08-11 23:24:44

+1

Atarikg,WCF在它的實現中支持基本的webservices以及更多的東西(這是一個巨大的,完整的框架),它非常漂亮,我不確定靜態方法在我的頭頂部被允許在WCF服務中 – 2009-08-11 23:52:04

回答

23

答案是:因爲你不行。

它不是這樣設計的。設計是創建一個Web服務類的實例,然後調用一個實例方法。

我只能猜測爲什麼微軟這樣設計它。要知道肯定,你必須問他們。考慮:

  1. 允許靜態方法沒有特別的好處。任何你可以用靜態方法做的事情,你也可以用一個實例方法來做。
  2. A [WebService]類並不意味着某些恰好被用作Web服務的任意類。它意味着您爲暴露Web服務操作而創建的類。因此,不需要支持已經存在且已經有靜態方法的類。
  3. SOAP Header實現允許您的類包含來自SoapHeader類的派生類型的實例字段。該字段將填入傳入的SOAP頭並/或將包含要返回的SOAP頭。您無法使用靜態字段來執行此操作,因爲它會被每個請求覆蓋。

正如我所說的,這些都是猜測。這個問題的正確答案是,「你不能這樣做,因爲這就是微軟設計它的原因,如果你想知道他們爲什麼這樣設計,你需要問問他們」。


FWIW,我剛剛檢查,並沒有出現WCF允許靜態方法是操作。

+0

+1好答案! :-) – 2009-08-11 22:45:55

+3

但我在問爲什麼?他們不會簡單地說:「好人,我們不會這樣設計這個東西,相反,它會以這種方式設計。」等等等等。我所問的是這背後的原因。 – Tarik 2009-08-11 23:30:15

+0

感謝您提供乾淨和精心的答案。 – Tarik 2009-08-12 04:31:04

3

當客戶端爲您的Web服務創建對象時,他們真正創建的是該Web服務的代理對象。此代理對象處理諸如爲您打開和關閉連接以及實際使用Web服務的所有開銷。靜態方法調用將很難管理。缺乏更好的單詞的「靜態代理」必須完成代理對象的實例在每次客戶端調用其中一個靜態方法時所做的所有事情,從而增加了大量開銷。

+0

我很確定他在談論服務器端,而不是客戶端。 – 2009-08-11 22:47:23

+1

我的答案以我認爲有助於解釋爲什麼服務器端的靜態方法無法工作的方式回答他的問題。只是說Web服務的設計是爲了他們不能不說,爲什麼他們是這樣設計的。 – 2009-08-11 22:49:41

+0

但這不是原因。服務器上發生的事情與客戶端上發生的事情無關。客戶端代理和服務器端Web服務實例之間沒有對應關係。服務器端並不僅僅是因爲客戶端代理是實例化的。基於這個推理,我將不得不倒下。 – 2009-08-11 22:53:44