C#WCF无法更改类属性

时间:2016-01-24 08:40:34

标签: c# wcf object

我正在做传感器的IoT事情,我正在尝试改变温度值。 我遇到的麻烦是我无法改变课堂上的财产。我正在使用Interface,类Sensors和实现接口的类。看下面的代码。 Bellow是类方法ChangeTemp(),仅用于测试

public string ChangeTemp()
{
    TemperaturaZrak = 12; //property value change - class sensor
    return TemperaturaZrak.ToString();//just for test if really change value
}

接口合约定义

[OperationContract]
string changeProperty();

实现接口的类

public string changeProperty()
{
    return sr.ChangeTemp(); //web service return new temperature?
}

全班传感器

[DataContract(Name ="SmartRoomClass")]
public  class SmartRoomClass
{
    private double t1;
    private double t2;
    [DataMember(Name = "temperaturaZrak")]
    public double TemperaturaZrak //getter,setter
    {
        get;
        set;
    }

    public SmartRoomClass() //constructor
    {
        TemperaturaZrak = 15;
    }

    public  void CheckTemperature1(double t1, double t2)
    {
        if (TemperaturaZrak >= t1)
        {
            TemperaturaZrak = 26;
        }
        if (TemperaturaZrak <= t2)
        {
            TemperaturaZrak = 22;
        }
    }
}

服务

namespace vaja_2sua.Services
{
    public class SmartRoom : ISmartRoom
    {
        SmartRoomClass sr = new SmartRoomClass();
        public void checkTemperature(double t1, double t2)
        {
            sr.CheckTemperature1(t1, t2);
        }

        public bool checkTemperature(double temperatura)
        {
            if (temperatura > 40)
                return true;
            else
                return false;
        }

        public  double getAirTemperature()
        {
            return sr.TemperaturaZrak;
        }
    }
}

界面

[ServiceContract(Name= "ISmartRoom")]
public interface ISmartRoom
{
    [OperationContract]
    void checkTemperature(double t1, double t2);

    [OperationContract(Name = "GetAirTemperature")]
    double getAirTemperature();
}

如果需要,我可以提供更多信息。 问候。

1 个答案:

答案 0 :(得分:1)

您的行为是预期的,因为如果您在不同的会话中调用WCF服务,则每次都会创建。让我们一步一步解释您的问题。

WCF服务实例中有3个选项定义InstanceContextMode枚举:

  • PerCall - 每次通话都会创建新的服务实例。
  • PerSession - 每个会话只有一个实例 州。
  • 单一 - 您将始终拥有相同的实例 上下文。

您可以使用ServiceBehaviorAttributeInstanceContextMode来指定WCF服务行为。

  

使用InstanceContextMode属性指定新服务的时间   对象已创建。因为服务对象不是直接的   连接到通信信道,服务的生命周期   对象与客户端之间通道的生命周期无关   和服务应用程序。默认值PerSession指示   服务应用程序在新建时创建新的服务对象   在客户端和服务之间建立通信会话   应用。同一会话中的后续调用由。处理   相同的对象。

在您的示例中,会发生以下操作:

  • 用户调用WCF服务的checkTemperature方法。
  • 在服务器上创建新频道和新会话。
  • 实例化SmartRoom类的新实例。当SmartRoom 构造它还会创建一个SmartRoomClass类的新实例 因为类初始化它的实例字段和属性(行 SmartRoomClass sr = new SmartRoomClass();已执行)。
  • 实际调用服务器的方法checkTemperature。它叫 SmartRoomClass.CheckTemperature1(...)方法发生了变化 TemperaturaZrak值。
  • 方法执行结束,您的客户端应用程序结束会话(或 只是不要存放它。)
  • 用户调用WCF服务的getAirTemperature方法。
  • 在服务器上创建新频道和新会话。
  • 实例化 SmartRoom 类的新实例。构建SmartRoom时,还会创建 SmartRoomClass的新实例 类新值 TemperaturaZrak
  • 实际调用服务器的方法getAirTemperature。它回来了 值15因为新实例SmartRoomClass已初始化 值。

现在您知道为什么从getAirTemperature方法返回默认温度。

如何根据您的需求修复此行为?首先,您可以将wcf服务客户端实例从调用存储到this example中的调用。

但是开放频道并不总是一个好主意,因为它需要额外的服务器资源。更好的方法是不仅在内存中而且在数据存储中更改SmartRoomClass和存储TemperaturaZrak值,这也可以为每个用户或其他方式保存不同的值。最简单的方法是使用文件或Isolated Storage