3

ここのサーバーにこのコードがあります(はい、ASMX が悪い考えであることはわかっていましたが、何らかの理由で WCF がまったく機能しません)。

<%@ WebService Language="C#" Class="Test" %>

using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://smplsite.com/smplAccess")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Test : System.Web.Services.WebService
{
    State s;

    public Test()
    {
        s = (Session["foo"] ?? (Session["foo"] = new State())) as State ;
    }

    [WebMethod(EnableSession = true)]
    public void Set(int j) { i=j; }

    [WebMethod(EnableSession = true)]
    public int Get() { return i; }
}

class State
{
    public int i = 5;
}

次のコードを実行すると:

class Program
{
    static void Main(string[] args)
    {
        var ser = new ServiceReference1.TestSoapClient();

        Console.WriteLine(ser.Get());
        ser.Set(3);
        Console.WriteLine(ser.Get());
    }
}

私は戻ってくることを期待しています:

5
3

しかし、私は戻ってきました

5
5

私の解決策

  1. プロキシwsdl.exeクラスの生成に使用する
  2. 必要に応じて参照を追加してコンパイルします
  3. マーティンのソリューションを使用する

これは関連しているようです

編集: State オブジェクトを追加しました。

4

3 に答える 3

6

Web サービスはステートレスであるため、複数の呼び出し間で状態を保存しません。メソッドを呼び出すたびに、サービスの新しいインスタンスが作成され、そのメンバーは再びデフォルト値になります。

あなたができることは、セッション状態を有効にして(行ったように)、状態をASP.NETセッションに保存することです。

このようなもの:

[WebMethod(EnableSession = true)]
public void Set(int j) { Session["i"] = j; }

[WebMethod(EnableSession = true)]
public int Get() { return Session["i"] == null ? 5 : (int)Session["i"]; }

これは、サーバー側で必要なものでした。ただし、クライアント側でも注意する必要があります。

ASP.NET セッションは Cookie によって識別されるため、すべての Web メソッド呼び出しで同じ Cookie をサーバーに渡す必要があります。そのためには、CookieContainer をインスタンス化し、それを Web サービス プロキシ インスタンスに割り当てる必要があります。

static void Main(string[] args)
{
    var ser = new ServiceReference1.TestSoapClient();
    ser.CookieContainer = new System.Net.CookieContainer();
    // ...
}
于 2009-04-30T17:51:33.650 に答える
2

セッションをオンにする必要があります。

[WebMethod(EnableSession = true)]
于 2009-04-30T17:43:13.047 に答える
0

セッションメソッド呼び出し間でクラス状態が保持されないように見えます-おそらく新しいオブジェクトが毎回呼び出されています。サービスを呼び出すたびに同じオブジェクト インスタンスを取得できるかどうかは、実際にはわかりません。ジョシュアの答えは正しいですが、サービスの内部フィールドをそのセッションに永続化するためのコードも記述する必要があります。

于 2009-04-30T17:46:12.960 に答える