2009-08-05 3 views
0

「ステートフルなサービスは悪い」ディスカッションにいかなくても...どのようにして1つを作成しますか?asp.netでステートフルXML WebServiceを作成するには?

有用な検索結果の欠如から、間違った用語を探しているか、積極的に落胆しているようです。私が見つけることができる最高のリンクはthis one on MSDN

私の現在のアプリケーションのような簡単なコンテキストを与えることでした。 Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code

これまでのところとても良いです。 WebMethodへの最初のリクエストを行うときには、作成するのに費用がかかるプロセス/リソースを起動する必要があることが判明しました。そこで私はこれらのリソースを再利用することを検討していました。

まずメンバー変数にしようとしました - それぞれのリクエストが新しいMyWebServiceクラスのインスタンスとその別のスレッドで処理されている唯一のライトバルブを持つようにしました。

リンクはこれを行う方法は、状態はユーザーごとである場合には、セッションのハッシュ/プロパティのコレクションを使用する

  • であることを示唆しています。状態は

質問グローバルである場合には、アプリケーションのハッシュ/プロパティのコレクションを使用する

    1. は、この権利ですか?私はいくつかの魔法の属性が欠けていますか?
    2. 私はApplicationハッシュテーブルメソッドを試しました...最初のリクエストで特定の既知のキーを設定しました。ただし、2番目の要求では、ハッシュテーブルはクリーン/アイテムなしの状態です。
    3. どのように同期を処理しますか?プライベートメンバーオブジェクトの.netロック方法は機能しません。

    私のWebサービス・クラスは次のようになります。..

    [WebService(Namespace = "http://Walkthrough/XmlWebServices/", 
         Description="A temperature conversion xml web service")] 
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
        [System.ComponentModel.ToolboxItem(false)] 
    
        public class TemperatureConverter : System.Web.Services.WebService, IDisposable 
        { 
         [WebMethod(Description = "This method converts celsius to fahrenheit")] 
         public double convert_fahrenheit_to_celsius(double temp_in_fahrenheit) 
         { 
         /// code 
         } 
        } 
    

    更新: 私はまだQ#2に苦しんでいます。いくつかの奇妙な動作があります。

    protected void Application_Start(object sender, EventArgs e) // global.asax.cs 
    { 
         Application["UserName"] = "Gishu"; 
    } 
    
    myWebMethod // MyWebService.cs 
    { 
        if (Application["myKey"] == null) 
        LoadHeavyObjectsAndCacheKeys(); // set Application["myKey"] between Application.Lock() Unlock() calls. 
        ... 
    } 
    

    "UserName"キーの書き込みは成功します。これはハッシュに存在します。しかし、私のWebメソッド内で書いたキーと値のペアは、現在のWebリクエストでは生き残れません。次のリクエストでは、ハッシュテーブルにはまだ1つの項目、「UserName」しかありません。これはApplicationStateなので、EnableSessionプロパティをtrueに設定する必要はありません。

  • 答えて

    1

    はい、セッション単位のデータにはSessionの状態を、アプリケーション全体のデータにはApplicationの状態を使用する必要があります。

    Webサービスの操作に[WebMethod(EnableSession=true)]属性が必要です。

    +0

    確認していただきありがとうございます。しかし、私はアプリケーションの状態を維持するいくつかの問題を抱えています..私の質問に更新を参照してください。また、私はASP.Net開発サーバーを実行しています - これはこの現象を引き起こす可能性がありますか? – Gishu

    +0

    デバッグ戦略として単純化することを提案します。 Application_StartのコードをWebメソッドにコピーしますが、キーを「Username1」に変更します。2回目のWebメソッドの呼び出し時に_this_ cellが初期化されているかどうかを確認してください。 –

    関連する問題