これはこのように機能するはずですか?
-
03-07-2019 - |
質問
このコードは私のサーバーにこちら(はい、私は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
マイソリューション
- プロキシクラスを生成するには、
wsdl.exe
を参照してください - 必要に応じて参照を追加してコンパイルします
- Martinのソリューション を使用する
編集:状態オブジェクトを追加しました。
解決
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();
// ...
}
他のヒント
セッションをオンにする必要があります。
[WebMethod(EnableSession = true)]
セッションメソッドの呼び出し間でクラスの状態が保持されないように見えます-おそらく毎回新しいオブジェクトが呼び出されています。実際に、サービスを呼び出すたびに同じオブジェクトインスタンスを取得できるかどうかはわかりません。ジョシュアの答えは正しいですが、コードを記述して、サービスの内部フィールドをそのセッションに保持する必要もあります。
所属していません StackOverflow