通过网络浏览器从 LAN 与 c# 服务通信
communicate with c# service from LAN through web browser
我创建了一个 C# 项目,它由本地系统帐户下的后端服务 运行 和当前登录用户帐户下的 GUI 运行 组成。
这两部分通过命名管道进行通信,实现方式为:
服务:
PipeHost = new ServiceHost(this, new Uri[] { new Uri("net.pipe://localhost") });
PipeHost.AddServiceEndpoint(typeof(IPipeComm), new NetNamedPipeBinding(), "MyProgComm");
PipeHost.Open();
界面:
ChannelFactory<IPipeComm> PipeFactory = new ChannelFactory<IPipeComm>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyProgComm"));
IPipeComm PipeProxy = PipeFactory.CreateChannel();
一切正常,但现在我被困在他们要求我添加的新功能上。
我必须找到一种从移动设备与服务通信(至少是单向服务)的方法,比方说 Android,连接到同一个 LAN。
起初我想构建一个简单的 Android 本机应用程序,它可以与服务中添加的 TCP 服务器进行通信。
这需要我认真研究一下,因为我以前从未做过类似的事情。
所以请允许我问:
哪种方法最简单?
我可以利用现有的命名管道来节省时间和编码吗?
这是否可以通过添加一个最小的网络服务器来完成,以避免创建移动设备应用程序而只使用其浏览器? (我真的很喜欢!)
我很困惑,所以非常感谢一些指南...
您要问的问题之一是您的 NetNamedPipeBinding
是否适用于这种情况。它不会。当服务与与服务通信的进程位于同一台机器上时,WCF 使用 NetNamedPipeBinding
。您描述的情况并非如此。
你问的是一个相当大的话题,但这里有一个开始的指针:尝试改用 BasicHttpBinding
或 WSHttpBinding
,因为它们可以处理以下情况客户端与服务不在同一台机器上。要熟悉这一点,您或许可以专注于从首先联系您的服务器的 PC 上的代码中获取它们 运行。请注意,无论您选择 Basic 绑定还是 WS 绑定,都存在真正的安全隐患。您必须弄清楚您的安全需求是什么以及如何进行。如果这是一个 Intranet,您可能能够通过相当简单的安全措施逃脱,但是您谈论的是移动设备这一事实使这听起来更加复杂。
您的下一步将是弄清楚如何让它在移动设备上运行。如果您的移动设备不是 windows 设备,WCF 的一些易用性将会丢失。 (在 windows 设备上可能仍会使用 svcutil 生成的客户端来调用您的服务)。在此处,我认为您可能需要考虑通过 WCF 使用 RESTful Web 服务。让你的 Android 应用与 Restful 服务对话可能比让它通过 wsdl 与服务对话更简单,但两者都可以。
我创建了一个 C# 项目,它由本地系统帐户下的后端服务 运行 和当前登录用户帐户下的 GUI 运行 组成。
这两部分通过命名管道进行通信,实现方式为:
服务:
PipeHost = new ServiceHost(this, new Uri[] { new Uri("net.pipe://localhost") });
PipeHost.AddServiceEndpoint(typeof(IPipeComm), new NetNamedPipeBinding(), "MyProgComm");
PipeHost.Open();
界面:
ChannelFactory<IPipeComm> PipeFactory = new ChannelFactory<IPipeComm>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyProgComm"));
IPipeComm PipeProxy = PipeFactory.CreateChannel();
一切正常,但现在我被困在他们要求我添加的新功能上。 我必须找到一种从移动设备与服务通信(至少是单向服务)的方法,比方说 Android,连接到同一个 LAN。
起初我想构建一个简单的 Android 本机应用程序,它可以与服务中添加的 TCP 服务器进行通信。
这需要我认真研究一下,因为我以前从未做过类似的事情。
所以请允许我问: 哪种方法最简单?
我可以利用现有的命名管道来节省时间和编码吗?
这是否可以通过添加一个最小的网络服务器来完成,以避免创建移动设备应用程序而只使用其浏览器? (我真的很喜欢!)
我很困惑,所以非常感谢一些指南...
您要问的问题之一是您的 NetNamedPipeBinding
是否适用于这种情况。它不会。当服务与与服务通信的进程位于同一台机器上时,WCF 使用 NetNamedPipeBinding
。您描述的情况并非如此。
你问的是一个相当大的话题,但这里有一个开始的指针:尝试改用 BasicHttpBinding
或 WSHttpBinding
,因为它们可以处理以下情况客户端与服务不在同一台机器上。要熟悉这一点,您或许可以专注于从首先联系您的服务器的 PC 上的代码中获取它们 运行。请注意,无论您选择 Basic 绑定还是 WS 绑定,都存在真正的安全隐患。您必须弄清楚您的安全需求是什么以及如何进行。如果这是一个 Intranet,您可能能够通过相当简单的安全措施逃脱,但是您谈论的是移动设备这一事实使这听起来更加复杂。
您的下一步将是弄清楚如何让它在移动设备上运行。如果您的移动设备不是 windows 设备,WCF 的一些易用性将会丢失。 (在 windows 设备上可能仍会使用 svcutil 生成的客户端来调用您的服务)。在此处,我认为您可能需要考虑通过 WCF 使用 RESTful Web 服务。让你的 Android 应用与 Restful 服务对话可能比让它通过 wsdl 与服务对话更简单,但两者都可以。