我正在使用三个WCF服务,一个用于使用串行端口监控刷卡读卡器,当用户刷卡时接收数据.然后将数据发送到另一个服务,该服务验证数据并调用其他服务以打开与该滑动端口关联的用户的门.
由于串行端口已由第一个WCF服务打开并监视,因此另一个服务无法访问端口以发送命令以打开门.当我尝试通过在滑动端口对象周围创建一个Singleton类来解决这个问题时,我能够获得相同的对象,但是状态没有保持不变,端口说它没有打开,但实际上它是通过第一个服务打开的.
我刚刚放置了我的端口类.请提出任何想法或建议.
public class Port : SerialPort
{
public Port(string port) : base(port)
{
}
public static Port Instance
{
get { return Nested.myPort; }
}
class Nested
{
static Nested() { }
internal static Port swipePort;
public static Port myPort
{
get
{
if (swipePort == null)
swipePort = new Port("COM4");
if (!swipePort.IsOpen)
swipePort.Open();
return swipePort;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
同一个端口不能打开两次.我建议一个WCF服务负责通过串口进行通信,其他WCF服务负责与该服务进行通信.例如,使用客户端证书或其他身份验证方案,以便对服务的调用不会导致未经授权的"门户开放"请求.
上面的示例创建了端口的静态实例,但静态实例在同一AppDomain的上下文中只是"静态".根据您的托管模型,两个WCF服务可能位于不同的AppDomain中.此外,对串行端口的读取和写入不是线程安全的,因此以这种方式使用SerialPort时会遇到问题.