2012-01-06 11 views
0

現在、SQL Server Service Brokerでメッセージを待つC#で書かれたWindowsサービスがあり、受信時にメッセージで渡された詳細を持つWebサービスメソッドが呼び出されます。SQLCLRストアドプロシージャにWebサービス参照インスタンスを保持する方法は?

私は、私は非常に簡単であることがわかってきた直接Webサービスを呼び出すSQLCLRストアドプロシージャ、でこれを置き換えたいです。私は内部の活性化を使用してこれを呼び出すことができます。

しかし、それはそれぞれの方法のためのWebサービスの新しいインスタンスを作成する必要がある、との経験から、私は、これはある程度の時間がかかることがわかりました。 Windowsサービスでは静的クラスで遅延インスタンス化を使用して作成しますが、静的フィールドを使用してSQLCLRに情報を格納することはできません。

このWebサービスリファレンスを維持する方法はありますか?編集

:ここには私が存続したいシングルトンを参照怠惰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; 
    } 
} 
それはそれぞれの方法のためにWebサービスの新しいインスタンスを作成する必要がある
+1

この情報は役に立ちましたか? http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/using-static-properties-in-sqlclr-udts.aspx –

+0

@AdamHouldsworth投稿する前にその記事を見ましたが、それはその制限を明らかにしましたが、溶液を与えなかった。 –

+0

解決策は、参照を静的な読み取り専用にすることです。初期化後に書き込み可能ではないため、SQLの問題は満たされます。 –

答えて

2

クライアントはHTTP呼び出しごとにプロキシをインスタンス化する必要があるのですか?それがあなたが何を意味するのであれ、あなたは参照を保持する必要はありません。処理されるメッセージがある場合、内部でアクティブ化されたプロシージャが起動され、アクティブで実行されたままになります。そのようなlocl状態は、WWW呼び出しを配置するために使用されるプロキシインスタンスである可能性があります。通常、プロシージャはループを実行し、スタック上の状態をループメソッドのローカル変数として保持します。詳細については、Writing Service Broker Proceduresを参照してください。より正確に言えば、コードはRECEIVEで、一度にというメッセージではなく、一連のメッセージです。

しかし、私はあなたがやっていることに反対することをお勧めします。まず第一に、SQLCLRからHTTP呼び出しを行うことは悪い考えです。 のSQLCLRでのブロックの種類が悪く、intertubezから応答するビットを待ってブロックするのは特に悪いことです。内部のSQL Serverリソース(特にworkers)はあまりにも価値があり、WWWサービスが応答するのを待つことはほとんどありません。私は彼らが今のように物事を維持することをアドバイスする、すなわち、外部のプロセスからHTTP呼び出しが発生している。

私が持っている第二のコメントはあなたがキューとしてテーブルを使用することの方が良いかもしれないということです。 Using tables as Queuesを参照してください。 HTTP呼び出しをキューに入れている典型的な問題の1つは、WWWが非常に信頼性が低く、タイムアウトと再試行を考慮する必要があるということです。テーブルをquueuとして使用することで、真のService Broker Queueよりも簡単にこれを実現できます。 SSBを使用すると、信頼できる再試行のためにconversation timersに依存しなければならず、アクティベーションロジックが大幅に複雑になります。

+0

+1。テーブルをキューとして使用する方法についての素晴らしい記事。デキュープロセスがポーリングに依存する必要がないように、通知またはペンディング可能なデキューをそのアイディアにどのように追加しますか?保留中の複数の読者を持つ能力は、私がキューイングにService Brokerを使用する傾向がある理由の1つですが、確かにセットアップには頭痛が伴うので、簡単な方法があれば.... – RickNZ

+0

@RickNZ SSBは本当にエースノンプールレシーブ、ボーナスとしての有効化*それを置き換えることはできません。しかし、あなたの待ち行列が十分に忙しいなら、あなたはポーリングで逃げることができます。私はテーブルベースのキューを使用してOPと同じようにシステムを実装し、大量の100個のWWW呼び出しをデキューし、[BeginGetResponse](http://msdn.microsoft.com/en-us/library/system)を使用して非同期にディスパッチします。 net.httpwebrequest.begingetresponse.aspx)。それは非常にうまく動作し、非常に高いスループットを達成することができました。すべてが外部の専用C#プロセスです。 –

+0

@RemusRusanuプロキシーなのかどうかわかりませんが、明確にするために残しておきたいインスタンス化コードを追加しました。しかし、あなたの2番目のパラは私をこのコースから離しました。私は、常時待機しているWindowsサービスではなく、外部からのアクティベーションを調べるかもしれません。私のボリュームは、テーブル・キューをポーリングするのに十分ではありません。 –

関連する問題