【问题标题】:Citrix virtual loopback doesn't work with our .NET C# appCitrix 虚拟环回不适用于我们的 .NET C# 应用程序
【发布时间】:2022-07-28 18:09:22
【问题描述】:

概述

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

Citrix 为此提供了一种称为虚拟环回的东西,并为此讨论了 Windows 的虚拟 IP。目前我们正在尝试虚拟环回。虚拟环回基本上允许每个会话使用不同的“本地主机”,形式为 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 问题产生了影响,见此 StackOverflow问/答: Java get REAL loopback address programmatically)。

顺便说一句,本地端口不能仅以编程方式为每个实例更改,因为 REST 调用用于获取会话的特定应用程序实例,因此如果端口发生变化,JavaScript 必须提前知道正确的端口,违背了目的。

推测

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

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

【问题讨论】:

    标签: c# windows localhost loopback citrix


    【解决方案1】:

    叹息,我最终回答了我自己的问题。但是对于在工作中发现这个问题的未来人......

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

    SomeApp.exe
    OtherApp.exe
    

    并且这些必须与使用 TCP/IP 的进程的名称完全匹配。

    然而,当你在 C# 中使用像 HttpListener 这样方便的类型时,你实际上是在使用 Windows 的内置 HTTP.sys 子系统(显然与 IIS 使用的是同一个),并且该子系统处于内核模式,所以它总是以System 运行。而且无法将 System 或 HTTP.sys 添加到该 Citrix 列表中。

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

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

    到目前为止,在 Google 中仅通过一次搜索就无法找到此问题的答案。但是,对于拼图的各个部分,网络上有很多参考资料。

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

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

    chrome.exe
    

    .

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

    【讨论】:

      【解决方案2】:

      在 citrix 上使用一个系统处理多个用户时,我也会遇到同样的问题。 我也在使用 TCPListner 您能否请教如何使用 socket 编程,或者请您发送一堆代码。

      提前致谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多