这应该是这样的吗?

BCS*_*BCS 3 asp.net web-services asmx

我有这样的代码了我的服务器在这里(是的,我知道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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下代码时:

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

        Console.WriteLine(ser.Get());
        ser.Set(3);
        Console.WriteLine(ser.Get());
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能回来:

5
3
Run Code Online (Sandbox Code Playgroud)

但我回来了

5
5
Run Code Online (Sandbox Code Playgroud)

我的解决方案

  1. USEE wsdl.exe生成一个代理类
  2. 根据需要添加引用以使其编译
  3. 使用Martin的解决方案

这似乎有关

编辑:添加状态对象.

M4N*_*M4N 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"]; }
Run Code Online (Sandbox Code Playgroud)

这是服务器端所需要的.但是你还必须在客户端照顾:

由于ASP.NET会话由cookie标识,因此您必须确保在每次Web方法调用时将相同的cookie传递给服务器.为此,您必须实例化CookieContainer并将其分配给Web服务代理实例:

static void Main(string[] args)
{
    var ser = new ServiceReference1.TestSoapClient();
    ser.CookieContainer = new System.Net.CookieContainer();
    // ...
}
Run Code Online (Sandbox Code Playgroud)