0

我有以下在 Visual Studio 2008 上开发的简单 WCF 库。
在运行调用此 wcf 服务的 WCFTestClinet/javascript(使用 SOAP)时,我在以下情况下得到错误值:
1. GetNumber --> 输出:“您的号码是0"
2. SetNumber --> 无输出
3. GetNumber --> 输出:"Your number is 0"而不是输出:"Your number is 8" !!!
谁能解释为什么会发生这种情况以及我该如何解决?
谢谢

public class Service1 : IService1
    {
        private int Number;

        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }

        public string GetNumber()
        {
            return string.Format("Your number is : {0}", Number);
        }

        public void SetNumber()
        {
            Number = 8;
        }
    }
4

5 回答 5

5

这都是关于实例的。默认情况下,每个会话都会实例化一个服务实例;但根据配置(例如使用 BasicHttpBinding),服务可能会在每次调用时实例化(和/或根本不支持会话)。

于 2012-12-04T13:57:20.953 回答
1

可能是因为您已将 WCF 服务配置为每次调用而不是每次会话。

很好的答案告诉差异:https ://stackoverflow.com/a/2542991/70386

于 2012-12-04T13:58:08.207 回答
0

这是在同一个例子中吗?因为 Number 将始终设置为 0 否则

于 2012-12-04T13:58:03.493 回答
0

我没有使用 SOAP WCF,但在我使用其他 Web 服务时,我的理解是每次调用服务时都会创建一个新实例。这意味着您在 SetNumber 上所做的任何事情都不存在于后面的 GetNumber 中,因为它是一个新实例。

如果您愿意,您可以将该值设为静态以保留调用之间的更改。

于 2012-12-04T13:58:24.760 回答
0

这是因为默认情况下,WCF 3.5 的实例模式是PerCall. 这意味着对于 WCF 接收到的每个调用,它都会创建服务类的新实例,执行调用,然后销毁该实例。

如果您想要共享值,您可以将您的服务配置为单例,如下所示:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class  Service1 : IService1
于 2012-12-04T14:00:50.453 回答