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)
wsdl.exe生成一个代理类编辑:添加状态对象.
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)
| 归档时间: |
|
| 查看次数: |
2601 次 |
| 最近记录: |