1

我有从 asp.net 应用程序访问扫描仪、条形码阅读器、相机等的奇怪要求。由于这些是本地资源,我知道这是不可能的。我想知道这个问题是否有其他解决方案。

我正在考虑创建一个将在本地系统上运行的 Windows 服务,并将打开一个端口并监听它并完成所需的工作。我想知道是否有一种方法可以使用 JS 或其他库或 activex 从 asp.net 页面向本地端口发送某种消息。

如果您有完全不同的解决方案,我会全力以赴。

4

2 回答 2

2

我们通过创建一个小型应用程序(TCL/TK 原创,因为它在 Win/Mac/Lin 上运行良好,但自从 mono 长大后现在是 C#/.NET)解决了一个类似的问题(连接到串行端口的票务打印机),即

  • 获取用户/密码
  • 使用 Web 请求创建会话。
  • 打开浏览器,
  • 将 URL 中的会话令牌作为锚点 (http[s]://foo.bar/baz?x=y#sessiontoken)

这样,它永远不会通过网络传输,而是可供客户端中的 JS 代码使用。

助手应用程序启动浏览器后,它使用长轮询和会话令牌(浏览器和助手应用程序都知道)与网络服务器通信 - 作为客户端应用程序,它可以很自然地与外围设备通信。

以这种方式打印的 1000 张门票中有 100 张...

编辑: 是的,我知道这会越来越长,但我需要(并且被要求)详细说明。

如果你想避免走我强烈建议的 ActiveX/Silverlight/whatever 路线,你需要 4 名玩家:

  1. 网络服务器
  2. 浏览器
  3. 助手应用程序(“代理”)
  4. 设备(票据打印机、条形码扫描仪等)

您的基本问题是,1. 需要与 4. 交谈,但不能。因此,您选择了两条并行路径:用于用户的通信在服务器和浏览器之间交换,而用于设备的通信在服务器和代理之间交换,后者将其中继到设备(当然反过来)。

代理是一个非常简单的应用程序,它通过操作系统设施与设备对话(具体如何完成当然取决于设备),并通过 HTTP 请求与网络服务器对话。

根据您需要的信息流方向:

  • 为了促进从设备到服务器的信息流,只需让设备上的活动触发网络请求。(输入设备,例如条码扫描仪)
  • 为了促进从服务器到设备的信息流,使用长轮询。(输出设备,例如票据打印机)
  • 对于两个方向都做(服务器触发的输入设备,例如相机)

现在剩下的问题是,如何将浏览器中的人为操作与设备操作相关联——简而言之:服务器如何将您在浏览器中选择的票发送票打印机,而不是发送到接下来进行长轮询的任何打印机。

为了解决这个问题,使用会话 ID 是很自然的选择——但它需要让浏览器和代理都知道相同的会话 ID。为此,您需要从一个到另一个进行通信。由于您无法将其从浏览器传递给代理(否则此讨论将没有实际意义),因此您需要以相反的方式进行沟通 - URL 中的锚点是实现此目的的工具。您执行以下操作:

  • 用户启动代理(不是浏览器!)并输入他的凭据
  • 代理调用向服务器发送登录 Web 请求,并取回会话令牌(请使用一些基本加密或使用 HTTPS)
  • 然后代理启动浏览器(例如通过执行cmd.exe /c start "http[s]://domain.tld/start.aspx?x=y#sessiontoken"
  • 由于会话令牌是一个锚点,它不会通过网络发送,但可供浏览器端的代码使用……宾果游戏!
  • 现在两个并行路径是打开的:人类请求的浏览器,知道会话令牌,代理现在进入上述模式,
于 2012-05-24T01:10:37.067 回答
0

您可以使用 ActiveX 来做到这一点,或者可能使用 Silverlight(或 Flash)来提供有限的支持(至少在我的经验中相机、麦克风和扫描仪)。

但是,鉴于以前与您尝试做的事情相关的经验,我建议您最好购买预构建的 SDK。

成像:

http://www.viscomsoft.com/

条码:

http://www.tec-it.com/software/barcode-software/tbarcode/barcode-generator/Default.aspx

于 2012-05-24T00:57:13.967 回答