0

「ステートフル サービスは良くない」という議論には入らずに... どうやって作成するのですか?

有用な検索結果が得られないことから.. 間違った用語を検索しているか、積極的に推奨されていないようです。私が見つけた最良のリンクは、MSDNのこれでした

現在のアプリがどのように見えるかを簡単に説明します。Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code

ここまでは順調ですね。ここで、WebMethod に最初の要求を行うときに、各呼び出しで作成、使用、破棄するのにコストがかかるプロセス/リソースを起動する必要があることがわかりました。そこで、これらのリソースの再利用を検討していました。

MyWebService最初に、それらをメンバー変数にしようとしましたが、各リクエストがクラスの新しいインスタンスによって処理され、その時点で別のスレッドで処理されるという電球の瞬間を持つだけでした。

リンクは、これを行う方法が

  • 状態がユーザーごとの場合にセッション ハッシュ/プロパティ コレクションを使用します。
  • 状態がグローバルの場合にアプリケーション ハッシュ/プロパティ コレクションを使用する

質問:

  1. これは正しいですか?いくつかの魔法の属性がありませんか?
  2. 最初のリクエストで特定の既知のキーを入力するアプリケーションハッシュテーブルメソッドを試しました。ただし、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 要求では存続しません。次のリクエストでは、ハッシュテーブルには「UserName」という 1 つの項目しかありません。これは ApplicationState なので、EnableSession プロパティを true に設定する必要はないと思います。

4

1 に答える 1

1

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

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

于 2009-08-05T22:14:33.410 に答える