如何在ASP.NET应用程序中唯一标识客户端计算机?

时间:2011-01-05 21:19:40

标签: asp.net web-applications

我有一个在托管环境中运行的服务器应用程序,但在客户端的本地网络中创建了打印作业(在NAT后面;这种机制与此无关)。

为了将打印作业发送到连接到工作站的打印机,我需要识别工作站。用户在工作站之间移动,因此我无法永久地将用户与工作站/打印机关联。简单的解决方案是要求用户识别他登录的机器,例如从列表中选择,但这会带来不便并且会受到用户错误的影响。

我已消除的选项:

  • 主机标头变量(无法识别可发送)
  • Cookie,支持用户选择。这有点解决了用户错误的可能性,但并非如此。
  • HTML5 DOM存储 - 客户端浏览器不支持

还有其他想法吗?

编辑:我确实可以选择puttnig这个特定的功能(创建一个打印作业)到一个胖客户端应用程序。然后可以配置应用程序,问题就会消失。但是用户体验将不得不在浏览器和Windows应用程序之间切换。

3 个答案:

答案 0 :(得分:7)

我不会讨论你的奇怪的场景,只回答你的问题:如何识别机器?

嗯,目前HTTP协议没有紧密的解决方案。所有机器共享相同的IP,因为它们位于NAT之后。你无法获得MAC地址。您无法获取硬件标识符。您无法确定所有计算机 会向服务器发送不同的标头(即所有不同的浏览器/版本)。

您可以依赖Cookie。尝试创建某种形式的计算机身份验证或更好的计算机标识页面,从每台计算机上浏览一次,告诉服务器哪台打印机要在该计算机上使用,< strong>然后在该计算机上设置永久Cookie 。

一旦cookie不被删除(也许你可以随时更新cookie,你永远不会知道......)你有一个简单的机制。

这是我能提出的最佳建议:(

答案 1 :(得分:0)

如果您在提出请求时查找服务器变量,您将拥有Request.ServerVariables [“REMOTE_ADDR”];如果应用程序是内部/内部网,则可能是内部IP。还有REMOTE_HOST。有时这些会被代理/防火墙/ nat过滤掉,但希望不是在你的情况下。

您也可以在HTTPRequest对象上调用这些,如Request.UserHostAddress。您可能需要通过当前上下文HTTPContext.Current.Request.UserHostAddress获取它。

如果你不能得到它,那么只需将文档,数据,文件返回到请求打印并通过Response.BinaryWrite()设置他们正在访问的文件的内容类型来选择他们的打印机。

此处列出了IIS的所有服务器变量,因为您使用的是ASP.NET:http://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx

另一种可能性是,如果用户是长时间运行的报告,则将其通过电子邮件发送给用户,或允许他们通过登录来访问文档以进行自我打印。

答案 2 :(得分:0)

如果REMOTE_ADDR实际上正如宣传的那样工作,你试过它的兄弟REMOTE_HOST吗?如果HOST不起作用,但是ADDR没有,那么

RemoteHostOughta = GetHostEntry(Request.ServerVariables("REMOTE_ADDR")).HostName

不幸的是,当我读REMOTE_ADDR

时,有一些我不知道的设置,我的IIS正在获取服务器IP(不是路由器!)而不是遥控器