2012-01-06 78 views
0

目前,我有一個用C#編寫的windows服務,它等待SQL Server Service Broker中的消息,並在收到消息時調用傳遞詳細信息的webservice方法。如何在SQLCLR存儲過程中保存webservice引用實例?

我想用一個SQLCLR存儲過程來直接調用webservice,我發現它很簡單。然後我可以使用內部激活來調用它。

但是,它需要爲每種方法創建一個新的web服務實例,並且根據經驗我發現這需要一些時間。在Windows服務中,我使用惰性實例在靜態類中創建它,但我知道靜態字段不能用於在SQLCLR中存儲信息。

有沒有辦法堅持這個webservice的參考?

編輯:這是懶惰的instantation代碼引用單身,我想堅持:

static class WsSingleton 
{ 
    static MWs.MWS mWS = null; 

    public static MWs.MWS GetMWS() 
    { 
     if (mWS == null) 
     { 
      mWS = new MWs.MWS(); 
      mWS.Credentials = new System.Net.NetworkCredential("user", "password", "domain"); 
     } 
     return mWS; 
    } 
} 
+1

對您有幫助嗎? http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/using-static-properties-in-sqlclr-udts.aspx – 2012-01-06 17:04:24

+0

@AdamHouldsworth我在發佈之前看過那篇文章,它澄清了限制,但沒有解決。 – 2012-01-09 10:29:18

+0

它給出的解決方案是使引用靜態只讀,這是初始化後不可寫,所以滿足SQL的問題。 – 2012-01-09 10:30:43

回答

2

它需要創建web服務的新實例爲每個方法

您的意思是客戶端必須爲每個HTTP調用實例化一個代理服務器嗎?如果這就是你的意思,你不應該堅持任何參考。當有消息要處理時,啓動內部激活的過程,並且該過程可以保持活動狀態並正在運行。這種locl狀態可能是用於放置WWW調用的代理實例。通常,該過程運行一個循環,並將堆棧中的狀態保存爲循環方法的局部變量。有關更多詳細信息,請參閱Writing Service Broker Procedures。更確切地說,你的代碼不應該是RECEIVE一個消息一次,而是一組消息。

但我會建議不要做你在做什麼。首先,從SQLCLR進行HTTP調用是個不錯的主意。做任何任何類SQLCLR中的阻塞是不好的,並阻止等待比特從intertubez響應是特別糟糕的。內部SQL Server資源(特別是workers)非常寶貴,很少浪費它們等待某些WWW服務作出響應。我會建議保持現在的狀態,即從外部進程發生HTTP呼叫。

我的第二個評論是,你可能會更好地使用表作爲隊列。見Using tables as Queues。排隊HTTP呼叫的一個典型問題是WWW非常不可靠,您必須考慮超時和重試。使用表格作爲quueu可以比真正的Service Broker Queue更容易實現。使用SSB時,您必須依賴conversation timers進行可靠的重試,這使您的激活邏輯顯得更加複雜。

+0

+1。關於使用表格作爲隊列的好文章。你會如何爲這個想法添加通知或可移植的出隊,所以出隊過程不必依靠投票?具有多個待處理讀者的能力是我傾向於使用Service Broker進行排隊的原因之一 - 但這確實是一個令人頭痛的問題,所以如果有更簡單的方法...... – RickNZ 2012-01-07 06:12:04

+0

@RickNZ SSB的確擁有非共享接收,並作爲獎勵激活。沒有任何東西可以代替*那*。但是如果你的隊列足夠忙,那麼你可以通過輪詢獲得勝利。我使用基於表格的隊列實現了一個系統,就像OP一樣,並使大量的100個WWW調用出隊,然後使用[BeginGetResponse](http://msdn.microsoft.com/zh-cn/library/system)調度它們的異步。 net.httpwebrequest.begingetresponse.aspx)。它工作得很好,並且能夠實現非常高的吞吐量。全部作爲外部專用的C#進程。 – 2012-01-07 06:36:04

+0

@RemusRusanu不知道它是否是代理,我添加了我想堅持澄清的實例化代碼。但是你的第二段已經讓我脫離了這個過程。我可能會調查外部激活,而不是一直在等待的Windows服務。我的卷不夠高,無法輪詢表隊列。 – 2012-01-09 10:25:40