我正在使用三种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;
}
}
}
}
答案 0 :(得分:5)
同一个端口无法打开两次。我建议一个WCF服务负责通过串口进行通信,其他WCF服务负责与该服务进行通信。使用客户端证书或其他身份验证方案,以便对服务的调用不会导致未经授权的" Open Door"请求,例如。
上面的示例创建了端口的静态实例,但静态实例只是"静态"在同一AppDomain的上下文中。根据您的托管模型,两个WCF服务可能位于不同的AppDomain中。此外,对串行端口的读取和写入不是线程安全的,因此以这种方式使用SerialPort时会遇到问题。