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

本文关键字:Windows API 连接 方式 是什么 返回值 窗体 服务 WCF 客户端 告诉我 | 更新日期: 2023-09-27 18:19:59

我有一个WCF窗口服务,它向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端口繁忙的问题。这显然是错误的,因为我不能以这种方式从调制解调器返回值。从我的角度来看,这一定是设计上的失败。

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

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

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

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

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

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

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

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

此外,这种设计将允许您最终正确地支持多个调制解调器,而您当前的设计将无法做到这一点。你可以有一个调制解调器池,当新的请求到达时,你可以从池中获得一个可用的调制解调器,执行工作单元,然后在完成时将调制解调器返回到池中,即使在失败的情况下也是如此。