带有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端口繁忙的问题。这显然是错误的,因为我不能以这种方式从调制解调器返回值。从我的角度来看,这一定是设计上的失败。
我试图实现的是,客户端可以通过服务与调制解调器通话,而不是两者都直接连接到调制解调器。但该服务可以处理与调制解调器连接的打开和关闭,并将命令从客户端传递到调制解调器。。。
所以我的问题是,设计这样一个场景的合适方式是什么?我不是在问代码,只是问它通常是如何设计的…
我很感激所有的回答:)提前谢谢!
我认为,如果您将与调制解调器的交互作为一个工作单元来执行,您可能会取得更大的成功。
例如,设计您的服务,使调用者调用单个方法来发送文本消息,从而在接口调用中提供所有必要的细节。
然后,该服务方法在单个工作单元中执行打开调制解调器、发送文本消息和关闭调制解调器所需的所有任务。
这种设计将使您能够确保调制解调器始终在工作单元内正确、完全地打开和关闭,而不是通过服务等待可能永远不会到达的额外命令。
此外,这种设计将允许您最终正确地支持多个调制解调器,而您当前的设计将无法做到这一点。你可以有一个调制解调器池,当新的请求到达时,你可以从池中获得一个可用的调制解调器,执行工作单元,然后在完成时将调制解调器返回到池中,即使在失败的情况下也是如此。