【问题标题】:Web service class field is null after the web method is executed?web方法执行后web服务类字段为空?
【发布时间】:2011-01-13 01:11:00
【问题描述】:

我的解决方案中有一个 Web 服务项目和一个 WPF 项目(用作客户端)。

表示 Web 服务的类非常简单,如下所示:

public class CardsGameService : System.Web.Services.WebService
{
    private Card magicCard;

    // Acts as a getter for magicCard field
    [WebMethod]
    public Card GetMagicCard()
    {
        return magicCard;
    }

    // Creates some random cards and sets the magicCard field
    [WebMethod]
    public Card[] GetNewCardSet()
    {
        Card[] cardSet = new Card[4];

        for (int i = 0; i < 4; i++)
        {
            cardSet[i] = GetRandomCard();
        }

        Random random = new Random();
        int index = random.Next(0, 3);

        // This field does get its value and 
        // is not null when this method is executed
        magicCard = cardSet[index];

        return cardSet;
    }
}

在我的客户端 WPF 代码隐藏类中,我正在实例化 CardsGameServiceSoapClient service 并调用返回一组卡片的 GetNewCardSet() Web 方法。

问题出在这里:
如果我想稍后调用 web 方法GetMagicCard(),它总是返回null为什么?我只实例化了一次CardsGameServiceSoapClient service,并且只要我运行我的客户端应用程序,这个对象就活着

【问题讨论】:

  • 更好的计划:不要在 Web 服务中使用状态。最佳计划:如果可以,升级到 WCF。

标签: c# asmx


【解决方案1】:

因为 WebService 实例是在每次调用的基础上创建和丢弃的。如果您想在多个 Web 服务调用之间共享状态,请使用静态字段。但请注意,您需要担心与处理任何其他多线程代码时相同的问题。两个调用可能同时进行,因此您需要在适当的情况下使用锁。

另外值得一提的是,IIS 可以并且将在任何时候以任何理由终止您的应用程序域,因此您不应依赖该字段将无限期地存在这一事实。如果需要持久化,请使用数据库或其他持久化存储。

【讨论】:

    【解决方案2】:

    问题在于,虽然您的代理客户端对象 (CardsGameServiceSoapClient) 在两次调用之间是活动的,但对您的服务的每次调用都是一个全新的请求,并且服务器对象在每个请求上都会被实例化......您需要为每个 web 方法创建和初始化你的对象(也许在构造函数中初始化它?)

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2011-03-05
      • 2012-11-11
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多