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();
}

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

C# WCF 无法更改类属性

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

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

  • PerCall - 每次调用都会创建服务的新实例。
  • 每个会话 - 每个会话只有一个实例,具有自己的实例州。
  • 单 - 您将始终拥有与其相同的实例上下文。

可以使用 ServiceBehaviorAttributeInstanceContextMode 指定 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值不仅存储在内存中,而且存储在数据存储中,该数据存储还可以为每个用户保存不同的值,或者以其他方式保存。最简单的方法是使用文件或独立存储。