C# WCF Windows服务带有指向Windows窗体客户端的API,API返回值告诉我它无法连接到设备。什么是首选方式?

C# WCF Windows服务带有指向Windows窗体客户端的API,API返回值告诉我它无法连接到设备。什么是首选方式?,c#,serial-port,C#,Serial Port,我有一个WCF windows服务,它向windows窗体应用程序公开API 与客户端的API连接: var serviceType = typeof(Mail2SmsServerApi); var uri = new Uri("http://localhost:8000/"); host = new ServiceHost(serviceType, new[] { uri }); var beh

我有一个WCF windows服务,它向windows窗体应用程序公开API

与客户端的API连接:

            var serviceType = typeof(Mail2SmsServerApi);

            var uri = new Uri("http://localhost:8000/");
            host = new ServiceHost(serviceType, new[] { uri });

            var behaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true };
            host.Description.Behaviors.Add(behaviour);

            host.AddServiceEndpoint(serviceType, new BasicHttpBinding(), "Hello");
            host.AddServiceEndpoint(typeof(IMetadataExchange), new BasicHttpBinding(), "mex");

            host.Open();
我的服务合同:

[ServiceContract]
public class Mail2SmsServerApi
{
    [OperationContract]
    public string Imei()
    {
        try
        {
            GSMHandler gsm = new GSMHandler();
            return gsm.GetImei();
        }
        catch (Exception ex)
        {
            LogText.Error("API GetImei(), exception: " + ex.ToString());
            return null;
        }
    }
}

我的GSMHandler类和方法:

    public bool OpenConnection()
    {

        modem = new GsmPhone(_comport, _baudrate, _timeout);

        if (!comm.IsConnected())
        {
            try
            {
                modem.Open();
                return true;
            }
            catch (Exception ex)
            {
                LogText.Debug("OpenConnection(), exception" + ex.ToString());
                return false;
            }
        }
        else
        {
            try
            {
                modem.Close();
                modem.Open();
                return true;
            }
            catch (Exception ex)
            {
                LogText.Debug("OpenConnection(), exception" + ex.ToString());
                return false;
            }

        }
    }
    public string GetImei()
    {
        string imei = "";
        try
        {
            imei = modem.RequestSerialNumber();
            LogText.Debug("IMEI:" + _IMEI);
            return imei;
        }
        catch (Exception ex)
        {
            LogText.Error("Error caught in GetImei(), exception: " + ex.ToString());
            return imei;
        }
    }
调用我的服务中的OnStart方法时,我正在使用以下命令打开与调制解调器的连接:

                gsm = new GSMHandler();
                gsm.OpenConnection();
调用OnStop时,我将使用以下命令停止它:

                gsm = new GSMHandler();
                gsm.OpenConnection();
我的想法是,通过这种设计,服务将处理通信,客户端和服务可以与调制解调器交互,而不会出现com端口未打开或com端口繁忙的问题。这显然是错误的,因为我无法通过这种方式从调制解调器返回值。这一定是我的设计失误

我试图实现的是,客户端可以通过服务与调制解调器通信,而不是两者都直接连接到调制解调器。但该服务可以处理打开和关闭与调制解调器的连接,并将命令从客户端传递到调制解调器

所以我的问题是,设计这样一个场景的合适方式是什么?我不是问代码,只是问它通常是如何设计的


我很感激所有的答案:)提前谢谢

如果您将与调制解调器的交互作为单个工作单元来执行,我认为您可能会取得更大的成功

例如,设计服务,使调用方调用单个方法来发送文本消息,并在接口调用中提供所有必要的细节

然后,服务方法在单个工作单元中执行打开调制解调器、发送文本消息和关闭调制解调器所需的所有任务

此设计将允许您确保调制解调器始终在工作单元内正确、完全地打开和关闭,而不是通过服务等待可能永远不会到达的其他命令


此外,此设计将允许您最终正确支持多个调制解调器,而您当前的设计不会支持多个调制解调器。您可以拥有一个调制解调器池,当新请求到达时,您可以从该池中获得一个可用的调制解调器,执行工作单元,然后在完成时将调制解调器返回到该池,即使在出现故障的情况下。

从客户端读取imei和调制解调器的信号强度,这是通过计时器完成的。该服务将发送短信。因此,在未知时间,客户端和服务都会发生不同的工作。我不认为这对我有帮助?还是我想错了?