「ステートフルなサービスは悪い」ディスカッションにいかなくても...どのようにして1つを作成しますか?asp.netでステートフルXML WebServiceを作成するには?
有用な検索結果の欠如から、間違った用語を探しているか、積極的に落胆しているようです。私が見つけることができる最高のリンクはthis one on MSDN
私の現在のアプリケーションのような簡単なコンテキストを与えることでした。 Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code
これまでのところとても良いです。 WebMethodへの最初のリクエストを行うときには、作成するのに費用がかかるプロセス/リソースを起動する必要があることが判明しました。そこで私はこれらのリソースを再利用することを検討していました。
まずメンバー変数にしようとしました - それぞれのリクエストが新しいMyWebService
クラスのインスタンスとその別のスレッドで処理されている唯一のライトバルブを持つようにしました。
リンクはこれを行う方法は、状態はユーザーごとである場合には、セッションのハッシュ/プロパティのコレクションを使用する
- であることを示唆しています。状態は
質問グローバルである場合には、アプリケーションのハッシュ/プロパティのコレクションを使用する
- は、この権利ですか?私はいくつかの魔法の属性が欠けていますか?
- 私はApplicationハッシュテーブルメソッドを試しました...最初のリクエストで特定の既知のキーを設定しました。ただし、2番目の要求では、ハッシュテーブルはクリーン/アイテムなしの状態です。
- どのように同期を処理しますか?プライベートメンバーオブジェクトの.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に設定する必要はありません。
確認していただきありがとうございます。しかし、私はアプリケーションの状態を維持するいくつかの問題を抱えています..私の質問に更新を参照してください。また、私はASP.Net開発サーバーを実行しています - これはこの現象を引き起こす可能性がありますか? – Gishu
デバッグ戦略として単純化することを提案します。 Application_StartのコードをWebメソッドにコピーしますが、キーを「Username1」に変更します。2回目のWebメソッドの呼び出し時に_this_ cellが初期化されているかどうかを確認してください。 –