【问题标题】:Is this supposed to work this way?这应该以这种方式工作吗?
【发布时间】:2009-04-30 17:39:35
【问题描述】:

我在我的服务器 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

编辑:添加状态对象。

【问题讨论】:

  • 我强烈建议您尝试让 WCF“Hello, world”服务正常工作,然后尝试找出为什么您的 WCF 版本的这个“根本不工作”。这将是坚持使用 ASMX 的一个不好的理由。
  • @John:WCF hello world 在我的系统上运行。在我的服务器上尝试相同的代码失败,并且与技术支持人员交谈表明 WCF 被正式禁止。

标签: asp.net web-services asmx


【解决方案1】:

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();
    // ...
}

【讨论】:

  • 类型上没有CookieContainer...嗯。
  • 如果您添加“Web 引用”,那么您应该会看到 CookieContainer 属性。
  • 尝试添加网络引用只是挂在上述博客的第 4 步。它只是永远坐在那里,“等待”栏在运行。
  • 我通过使用 WSDL.exe 并添加一些 System.Web.* 引用解决了这个问题。
【解决方案2】:

您需要开启会话。

[WebMethod(EnableSession = true)]

【讨论】:

  • 检查 asmx 的 web.config 中的 configuration/system.web/sessionState。如果将其设置为“关闭”,它可以覆盖您的网络方法上的会话。
  • 我什至没有 web.config
【解决方案3】:

在我看来,它在会话方法调用之间没有持久的类状态 - 可能每次都会调用一个新对象。我实际上不确定每次调用服务时是否可以依赖获取相同的对象实例。 Joshua 的回答是正确的,但您还需要编写代码以将服务的内部字段持久保存到该会话中。

【讨论】:

  • @John:您可以依赖永远两次获取相同的实例。您会为每个请求获得一个新实例!
  • @John 是的,我就是这么想的。我很懒惰去检查,因此想对冲我的赌注。 :)
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 2017-12-19
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多