我有我正在try 编写的软件,需要连接到OPC-UA服务器.该软件被托管在一个 docker 集装箱内,而OPC-UA服务器最终将嵌入到我公司使用的PLC中.目前,我try 使用在我的Windows PC上本地运行的Prosys OPC-UA模拟服务器.我使用的是最新版本的Docker Desktop,打开了WSL2模式(而不是使用Hyper-V).这是一个.NET应用程序(.NET 6),它使用OPCFoundation.NetStandard.Opc.Ua Nuget包来处理与UA服务器的通信.我还可以确认.NET UA库读取的XML配置文件位于软件预期的位置(EXE的根目录).

在docker环境之外运行时,我可以使用连接字符串opc.tcp://<my_windows_ip>:53530/OPCUA/SimulationServer很好地连接到Prosys UA服务器.一旦我创建了一个docker映像,创建了一个容器,并try 连接到服务器,它就失败了.我试过了

  • 主机名为Host.docker.Internal
  • Linux 172.17.0.1地址(应该是主机PC的地址)
  • Prosys连接字符串原样
    • opc.tcp://&lt;fully_qualified_computer_name&gt;:53530/OPCUA/SimulationServer
  • 127.0.0.1(我以为它无论如何都不会起作用)
  • try 在docker-compose.yml文件中进行不同的端口映射
  • 连接到具有嵌入式UA服务器的实际PLC

每一次try 都失败了.我试图通过编写一个在我的电脑上本地运行的非常简单的TCP Listener应用程序来排除OPC,并添加了一个指向docker中包含的应用程序的ASP.NET路由,该应用程序通过TCP向未在docker中运行的应用程序发送消息.我让它听0.0.0.0:13000,我的应用程序是由一个连接到它的 docker 容器托管的,很好.

我做这件事已经快一个星期了,我不知道下一步该怎么办.令我惊讶的是,我无法连接到一个有自己的服务器的真正的PLC.

推荐答案

在try 创建会话时,我发现客户端正在连接到服务器.这个问题与Docker的形象有关.我们将Linux映像用于容器,并将编译后的程序复制到Images/app文件夹中.我们还在图像中添加了一个用户.该用户对/app文件夹没有写入权限.这意味着我正在使用的OPCUA API无法创建文件夹并将从服务器发送的证书写入文件系统.一架System.IO.IOException被抛出.

我将/app文件夹的所有权更改为这个创建的用户(也是递归的),并确保该用户对该文件fixture 有读写权限.一旦我做到了这一点,一切都正常了.

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

创建仅包含msBuild.Target的Nuget包

Powershell机器令牌组

在PowerShell中,XML子对象和属性是对象属性.它怎麽工作?

为什么Regex.Escape支持数字符号和空格?

如何在 Raspberry Pi 上托管 WASM 文件?

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

在 C# 中获取 log4net 日志(log)文件

C#6.0 字符串插值本地化

将 int 转换为 .NET 中的位数组

使用 Windows 服务和 C# 检测 USB 驱动器插入和移除

msbuild,定义条件编译符号

Await 运算符只能在 Async 方法中使用

为什么 .NET 中不需要 Maven?

如何在可取消的异步/等待中处理 TransactionScope?

System.Speech.Recognition 和 Microsoft.Speech.Recognition 有什么区别?

有没有像样的 C# 分析器?

如何找到二维数组的大小?

.NET 图形库?

.NET 中的 java.lang.IllegalStateException?