我正在做传感器的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();
}
如果需要,我可以提供更多信息。 问候。
答案 0 :(得分:1)
您的行为是预期的,因为如果您在不同的会话中调用WCF服务,则每次都会创建。让我们一步一步解释您的问题。
WCF服务实例中有3个选项定义InstanceContextMode
枚举:
您可以使用ServiceBehaviorAttribute
和InstanceContextMode
来指定WCF服务行为。
使用InstanceContextMode属性指定新服务的时间 对象已创建。因为服务对象不是直接的 连接到通信信道,服务的生命周期 对象与客户端之间通道的生命周期无关 和服务应用程序。默认值PerSession指示 服务应用程序在新建时创建新的服务对象 在客户端和服务之间建立通信会话 应用。同一会话中的后续调用由。处理 相同的对象。
在您的示例中,会发生以下操作:
checkTemperature
方法。SmartRoom
类的新实例。当SmartRoom
构造它还会创建一个SmartRoomClass
类的新实例
因为类初始化它的实例字段和属性(行
SmartRoomClass sr = new SmartRoomClass();
已执行)。checkTemperature
。它叫
SmartRoomClass.CheckTemperature1(...)
方法发生了变化
TemperaturaZrak
值。getAirTemperature
方法。SmartRoom
类的新实例。构建SmartRoom时,还会创建 SmartRoomClass
的新实例
类新值 TemperaturaZrak
! getAirTemperature
。它回来了
值15因为新实例SmartRoomClass
已初始化
值。现在您知道为什么从getAirTemperature
方法返回默认温度。
如何根据您的需求修复此行为?首先,您可以将wcf服务客户端实例从调用存储到this example中的调用。
但是开放频道并不总是一个好主意,因为它需要额外的服务器资源。更好的方法是不仅在内存中而且在数据存储中更改SmartRoomClass
和存储TemperaturaZrak
值,这也可以为每个用户或其他方式保存不同的值。最简单的方法是使用文件或Isolated Storage。