2010-02-10 61 views
3

我們有一些ASP.NET的東西(它沒有清楚地描述爲稱它爲一個組件),我們希望清理並圍繞一些邊界,以便我們可以重複使用它。實際上,這有四個部分,一些標記,一些C#代碼隱藏,一些在瀏覽器中運行的JavaScript,以及由javascript調用的web服務方法。共享程序集(DLL)中的ASP.NET webservices

清除這個問題的一種方法是將標記移動到用戶控件中,將C#轉換爲用戶控件的代碼隱藏方法,將javascript轉換爲代碼中將包含在頁面中的文件,後面的方法,並將webservice轉換爲代碼隱藏的靜態方法。 (當然,假設我可以將用戶控件中的靜態方法標記爲WebMethod並使其工作,但我還沒有嘗試過。)

無論如何,以上都不適用於我們,因爲我們想創建一個可以包含在多個項目中的組件。這意味着我們需要一個我們可以包含在DLL中的組件,這意味着一個服務器控件,而不是一個用戶控件。

服務器控件當然沒有標記。 html需要通過C#注入頁面。這不是問題,我們之前已經完成了。將javascript包含爲資源,並將Server Control插入到頁面中似乎並不困難。我還沒有做到,但是我看到了很多關於如何做的例子,所以我相信我能弄明白。

但是這個我不確定我理解的部分,但是,是web服務。這個控件將包含JavaScript,這將使得調用回到web服務。 Web服務將只與服務器控件通信,但它需要與包含服務器控件的Web應用程序正在交談的同一數據庫進行通信。也就是說,在這種情況下,我們可以配置一個獨立的Web服務,以使服務器控件的所有實例都可以與之通話,我們需要在包含服務器控件的每個Web應用程序中包含一個單獨的Web服務。

問題是,既然服務器控件包含在一個DLL中,我們希望這個web服務的代碼也包含在DLL中。現在,我所能想到的只是在DLL中定義一個類,它完成了web服務所需的所有工作,然後可以通過我們在Web應用程序中定義的web服務來調用它。但我對此並不滿意。在我理想的世界中,只需在Web應用程序中包含服務器控件就可以自動包含和配置它需要與之交談的Web服務。但我不知道該怎麼做,我不確定這是可能的。

因此,我正在尋找的是在ASP.NET 3.5中可以接近的程度。

想法?

+0

我喜歡這個問題的答案沒有任何投票。 – 2014-08-08 20:15:41

回答

1

據我所知,有沒有辦法完全封裝在服務器控件中的服務器端的端點。這是我過去一直沒有完全滿意的解決方案與之搏鬥的事情。

也許最乾淨,最習慣的.NET解決方案是使用HttpHandler作爲服務器端的端點。消費應用程序將需要添加一行web.config,但不需要創建其他文件。

查看ASP.NET AJAX如何實現ScriptResource.axd以獲得此方法的一個很好的具體示例。源代碼爲:http://www.microsoft.com/downloads/details.aspx?FamilyId=EF2C1ACC-051A-4FE6-AD72-F3BED8623B43&displaylang=en

+0

我不確定我同意使用HttpHandlers。首先,它們仍然是ASP.NET編程中的一個晦澀難懂的東西,大多數開發人員並不常用,也沒有很好的理解。其次,當一個未來的維護程序員試圖理解控件時,它是控件的代碼,以及他將要查看的頁面。它可能只是web.config中的一行,但它不在視圖中。 WebMethod在頁面上將其功能委託給控件中的某個方法,其優點是可以存放在維護程序員將要查看的源文件中。 – 2010-02-12 13:52:38

+0

這是有道理的,我不從根本上不同意,但我不知道在DLL中嵌入端點時的現實替代方案。 – 2010-02-12 16:13:39

0

如果你的webservice只與一個控件進行通信,並且web應用程序的每個實例都需要它自己的webservice ....那麼我不確定我看到它是web服務的目的。

你確定你不能只是使Web服務功能的一部分的應用程序?它是做什麼的,它需要成爲一項服務?

+0

JavaScript正在瀏覽器上運行。它需要與運行在服務器上的代碼異步通信。服務器上必須有東西在監聽通信。 Web服務是這樣做的通常機制。 web服務可以獨立實現,也可以作爲Web應用程序中的.asmx文件實現,也可以作爲頁面上的靜態方法實現,標記爲WebMethod(如果設置了EnablePageMethods)。 但是,所有這些都需要在服務器控制之外實例化一些東西。我想盡量減少。 – 2010-02-10 18:55:34

0

我會明確定義Web服務的API,以便服務器控件可以「知道」如何調用它們。應該動態實例化服務器控件,以便它將包含根據預先調用的API調用WebServices所需的JavaScript。在生產

  • 我有代碼與配置JavsScript功能創建數據庫驅動的動態控制
  • 上面後面標記爲的WebMethod代碼靜態方法作爲說明(如果的EnablePageMethods設置),可以調用一些DB: 我提出這一點,因爲進一步層等
  • 你可以使用jQuery從WebService推新數據頁面asyncronously

無論如何,我會很高興也瞭解其他辦法...

反正檢查此link

Using jQuery to directly call ASP.NET AJAX page methods

+0

是的,所有這一切。我希望ServerControl的用戶能夠儘可能地使用該控件。這意味着ServerControl封裝了web服務的外觀,它是如何被調用的,它返回的是什麼等。但是如何運行web服務是個問題。 在頁面上放置一個WebMethod非常簡單,但這需要ServerControl的用戶在頁面上創建WebMethod。當它被添加到頁面時,我寧願讓ServerControl創建WebMethod。但我不確定這是可能的。 – 2010-02-10 21:06:33

+0

我明白了。我可以給你的唯一提示是檢查CodePlex中的BlogEngine源代碼 - 項目中的頁面是從一開始就動態創建的......我想如果可以動態創建整個頁面,應該可以添加靜態Web方法動態...無論如何,我仍然對你的問題的解決方案感興趣 - 我想這也將很快成爲我的問題; )所以,如果你可以發佈一些博客鏈接或任何你如何解決這個問題,我將不勝感激...... – 2010-02-11 06:45:00

0

我看到這個帖子已經有兩三年了,但我認爲我會把我的兩分錢投入到它的價值中。

如果我正確理解你的話,我相信我正在做一些與我寫的特定服務器控件類似的東西,你可能想看看。

簡而言之,它使用DLL中的舊式ICallbackEventHandler接口進行通信。我嵌入了JavaScript異步執行回調直接與服務器控件進行通信。

這一切都很好,但您需要了解一些限制。

首先,CallbackEvent方法不如靜態WebMethod輕。我相信(至少大部分)頁面生命週期是作爲回調處理的一部分執行的。

第二個是「只能有一個」:)所以如果你有其他控件使用相同的CallbackEvent風格的通信,你需要小心,並確保你知道哪一個觸發回調。在我的控制中,我在RaiseCallbackEvent上有一個額外的參數,可以用來告訴哪個控件進行了調用(並且它暴露了用戶可以訂閱的自定義事件)。

不幸的是,儘管它並不完美,但這僅僅是 最好的 解決方案,我已經能夠將所有描述的功能完全包裝到單個可重用服務器控件中。

如果你有興趣,這裏是complete source (with demos)

+0

我最終做的是在組件中創建一個實現我所需的所有功能的類。當我在Web應用程序中使用程序集時,我編寫了一個提供接口的.asmx Web服務,並簡單地將這些參數轉發給實現類的實例。 – 2012-05-09 14:37:16