gpt4 book ai didi

asp.net - 这应该是这样的吗?

转载 作者:行者123 更新时间:2023-12-02 04:07:51 25 4
gpt4 key购买 nike

我的服务器上有此代码 here (是的,我知道 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. 使用Martin's解决方案
<小时/>

This Seems related

编辑:添加状态对象。

最佳答案

Web 服务是无状态的,因此它们不会在多次调用之间存储其状态。每次调用方法时,都会创建一个新的服务实例,并且其成员将再次具有默认值。

您可以做的是启用 session 状态(正如您所做的那样)并将您的状态存储在 ASP.NET session 中。

类似这样的事情:

[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 session 是由 cookie 标识的,因此您必须确保在每次 Web 方法调用时将相同的 cookie 传递到服务器。为此,您必须实例化 CookieContainer 并将其分配给 Web 服务代理实例:

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

关于asp.net - 这应该是这样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/808168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com