Citrix 虚拟环回不适用于我们的 .NET C# 应用程序

Citrix virtual loopback doesn't work with our .NET C# app

概览

我们公司即将向使用 Citrix XenApp(或已重命名的任何名称)的客户分发 C# .NET / WPF 应用程序。此应用程序在一个 Citrix 服务器上运行多次,每个用户运行一次,作为其 Citrix 会话的一部分。应用程序的每个实例都必须响应从 localhost:xxxx 获取的浏览器 Java 脚本,xxxx 始终是相同的端口号。

Citrix 为此提供了称为虚拟环回的东西,并且还讨论了 Windows' 虚拟 IP。目前我们正在尝试虚拟环回。 Virtual Loopback 基本上允许每个会话使用不同的“本地主机”,形式为 127.0.0.1、127.0.0.2、127.0.0.3 等。 Citrix 在这里详细描述了两者:https://docs.citrix.com/en-us/xenapp-and-xendesktop/7-15-ltsr/manage-deployment/virtual-ip-virtual-loopback.html.

基本上,它不适用于 .NET。相比之下,一位同事使用 Citrix 方法使用 Python 测试应用程序作为实验,效果很好。

这是 Citrix 中的一个分为两部分的策略(一般设置,以及命名可以使用重定向的应用程序),并且都已正确设置。这也不是浏览器找不到正确地址的问题;这将使用 Citrix 策略进行设置,但失败发生在我们的应用程序启动时,并且只有第一个实例可以绑定到套接字(自然)。

历史和最新步骤

在我们的代码中,使用 localhost 作为文字解析为 0:0:0:0,这不是 127.x.x.x 系列的一部分,因此失败。基本上,那部分现在对我来说很有意义。然而,当我尝试在代码中使用 127.0.0.1 时,认为设置可能会透明地重定向,尽管它被拼写出来,但根本不起作用。

所以现在我正在尝试可能有帮助或没有帮助的解决方法,例如使用 IPAddress.Loopback 并确保 IP 地址是 IPv4(被发现对类似 Java几年前的问题,在这个 Whosebug Q/A 中看到: Java get REAL loopback address programmatically).

顺便说一句,本地端口不能只为每个实例以编程方式更改,因为 REST 调用用于获取会话的特定应用程序实例,因此如果端口不同,Java脚本将具有提前知其然,败其旨。

推测

我的同事推测问题是我们创建的应用程序作为系统运行,但据我所知,这是使用 .NET Web 堆栈的副产品,因为测试应用程序实际上是 运行 在我的用户名下。它显然也无法更改,因为它是副产品。也许我在那里错过了什么?

有没有人见过这个问题,你找到的答案是什么?

唉,我终于回答了我自己的问题。但是对于以后在工作中发现这个问题的人...

所需的两个 Citrix 虚拟环回策略之一需要一个应用程序名称列表,这些应用程序将获取重定向地址,每个都在自己的行中,例如

SomeApp.exe
OtherApp.exe

并且那些必须与使用 TCP/IP.

的进程的名称完全匹配

但是,当您在 C# 中使用像 HttpListener 这样方便的类型时,您实际上是在使用 Windows' built-in HTTP.sys 子系统(IIS 使用的是同一个,显然),并且 sub-system 处于内核模式,因此它始终以 System 运行。而且无法将系统或 HTTP.sys 添加到该 Citrix 列表中。

因此,为了使 Citrix 和您自己的 .NET HTTP 侦听能够很好地相互配合,您不能使用 HttpListener 或类似的对象(我怀疑其中包括类似 TcpListener ).相反,您必须使用 System.Net.Sockets 中的 Socket 滚动您自己的 HTTP,这根本不涉及 HTTP.sys,或者使用不使用 HTTP.sys 的 NuGet 包=47=] 作为依赖项。

对于大多数用途,使用 NuGet 包肯定更好。就我而言,我正在推出自己的产品,至少目前是这样,因为我从其他人那里继承的倾听方法只响应一个请求,并且只响应一件事。

到目前为止,在 Google 中一次搜索都不可能找到此问题的答案。但是,网络上有很多关于拼图各个部分的参考资料。

总而言之:将两个 Citrix 策略用于虚拟环回,不要使用 HttpListener 或 .NET 中最终在内部使用 HTTP.sys 的任何其他内容。您可以通过查看 Microsoft 的 TCPView(或其他工具)并查看您选择的端口是否以系统作为其进程(即使您的应用程序显示在您的用户下的任务管理器中)来判断 .NET 或 NuGet 中的某些内容是否使用它姓名)。

最后,调用您的 .NET 应用程序的任何应用程序也必须在该 Citrix 列表中,例如

chrome.exe

.

希望有一天这对其他人有所帮助!