6

私は今、次のようなものを持っています:

public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public string Method1()
    {
        SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
        return so.Method1(); //this exetus in a moment 
    }

    [WebMethod]
    public string Method2()
    {
        SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
        return so.Method2(); //this exetus in a moment 
    }

 ...
}

SomeObj soステートフルな Web サービスを作成して、同じオブジェクトのメソッドを再利用して呼び出すことはできますか?

したがって、このサービスを使用するクライアントは、最初にsoオブジェクトを作成して ID を返す Web メソッドを呼び出します。その後の呼び出しで、Web サービスはsoID に基づいて同じオブジェクトを再利用します。

編集


これが私の実際のコードです:

[WebMethod]
public List<ProcInfo> GetProcessList(string domain, string machineName)
{
    string userName = "...";
    string password = "...";
    TaskManager tm = new TaskManager(userName, password, domain, machineName);

    return tm.GetRunningProcesses();
}

[WebMethod]
public bool KillProcess(string domain, string machineName, string processName)
{
    string userName = "...";
    string password = "...";
    (new TaskManager(userName, password, domain, machineName);).KillProcess(processName);               
}
4

3 に答える 3

6

ステートフル Web サービスはスケーラブルではないため、お勧めしません。代わりに、高価な操作の結果をキャッシュに保存できます。このキャッシュは、スケーラビリティを向上させるために、カスタム プロバイダーを通じて配布できます。

[WebMethod]
public string Method1()
{
    SomeObj so = TryGetFromCacheOrStore<SomeObj>(() => SomeClass.GetSomeObj(), "so");
    return so.Method1(); //this exetus in a moment 
}

[WebMethod]
public string Method2()
{
    SomeObj so = TryGetFromCacheOrStore<SomeObj>(() => SomeClass.GetSomeObj(), "so");
    return so.Method2(); //this exetus in a moment 
}

private T TryGetFromCacheOrStore<T>(Func<T> action, string id)
{
    var cache = Context.Cache;
    T result = (T)cache[id];
    if (result == null)
    {
        result = action();
        cache[id] = result;
    }
    return result;
}
于 2010-11-07T12:59:32.763 に答える
1

オプション1

HttpSessionを使用できます。

//this executes very long time, 50s and more, but only once.
private SomeObj SessionSomeObj { 
  get 
  { 
    var ret = (SomeObj)Session["SomeObjStore"] ?? SomeClass.GetSomeObj();
    SessionSomeObj = ret;
    return ret; 
  }
  set { Session["SomeObjStore"] = value; }
}

[WebMethod(EnableSession = true)]
public string Method1()
{
    return SessionSomeObj.Method1(); //this exetus in a moment 
}

[WebMethod(EnableSession = true)]
public string Method2()
{
    return SessionSomeObj.Method2(); //this exetus in a moment 
}

これは、クライアントごとに一度に1つの呼び出しが行われた場合にのみ機能することに注意してください。

オプション2

クラスはそのままにしておくことができますが、WebMethodの使用方法は異なります。.Netで生成されたクラスから呼び出す場合はasync、これらのオカレンスに対応するメソッドが提供されています。基本的に、Method1 begin requestメソッドを呼び出し、実行が終了したときにコールバックを取得します。ただし、これを機能させるには、Webサービスクライアントクラスのタイムアウトパラメータを微調整する必要がある場合があります。

オプション3

SixPackライブラリのキャッシュ機能を使用して、これを簡単に行うことができます。;-)


[コメント後に編集] オプション1に2つの静的フィールドがあり、要求に応じて、メソッドごとに1つずつ、2つの異なるインスタンスを許可します。


[詳細な説明の後に編集] Sessionを使用して呼び出しをステートフルにします。

参照: http: //msdn.microsoft.com/en-us/library/aa480509.aspx

オプション3も追加しました。

于 2010-11-07T13:56:11.957 に答える
0

インターフェイスを次のように変更しServiceContractます。

[ServiceContract(SessionMode = SessionMode.Required)]

クラスに次の属性を追加します。

[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerSession)]

詳細と例については、 http://msdn.microsoft.com/en-us/library/system.servicemodel.sessionmode.aspxを参照してください。

于 2010-11-07T13:46:01.747 に答える