C# WCF 无法更改类属性
本文关键字:属性 WCF | 更新日期: 2023-09-27 18:31:40
我正在用传感器做一些物联网的事情,我正在尝试改变温度值。我遇到的麻烦是我不能改变我在课堂上的财产。我正在使用接口、类传感器和实现接口的类。看看下面的代码。波纹管是类方法 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();
}
如果需要,我可以提供更多信息。问候。
您的行为是预期的,因为如果在不同的会话中调用 WCF 服务,则每次都会创建 WCF 服务。让我们一步一步地解释您的问题。
WCF 服务实例化中有 3 个选项定义InstanceContextMode
枚举:
- PerCall - 每次调用都会创建服务的新实例。
- 每个会话 - 每个会话只有一个实例,具有自己的实例州。
- 单 - 您将始终拥有与其相同的实例上下文。
可以使用 ServiceBehaviorAttribute
和 InstanceContextMode
指定 WCF 服务行为。
使用 InstanceContextMode 属性指定新服务的时间 将创建对象。因为服务对象不是直接的 连接到通信通道,服务的生命周期 对象与客户端之间通道的生存期无关 和服务应用程序。默认值 PerSession 指示 服务应用程序在创建新的服务对象时 在客户端和服务之间建立通信会话 应用。同一会话中的后续调用由 相同的对象。
在您的示例中,将发生以下操作:
- 用户调用 WCF 服务的方法
checkTemperature
。 - 在服务器上创建新通道和新会话。 实例
- 化
SmartRoom
类的新实例。当智能房间构造它还创建了SmartRoomClass
类的新实例因为类初始化其实例字段和属性(行SmartRoomClass sr = new SmartRoomClass();
执行)。 - 方法
checkTemperature
实际上是在服务器上调用的。它调用SmartRoomClass.CheckTemperature1(...)
更改的方法TemperaturaZrak
值。 - 方法执行结束,客户端应用结束会话(或只是不要存储它)。
- 用户调用 WCF 服务
getAirTemperature
方法。 - 在服务器上创建新通道和新会话。 实例
- 化
SmartRoom
类的新实例。当SmartRoom构建时,它还创建了一个新的SmartRoomClass
实例具有新值的类TemperaturaZrak
! - 方法
getAirTemperature
实际上是在服务器上调用的。它返回值 15,因为新实例SmartRoomClass
初始化价值。
现在您知道为什么从该方法返回默认温度getAirTemperature
了。
如何根据您的需求修复此行为?首先,可以将 wcf 服务客户端实例从一个调用存储到另一个调用,如本例所示。
但是打开通道并不总是一个好主意,因为它需要服务器的额外资源。更好的方法是更改SmartRoomClass
并将TemperaturaZrak
值不仅存储在内存中,而且存储在数据存储中,该数据存储还可以为每个用户保存不同的值,或者以其他方式保存。最简单的方法是使用文件或独立存储。