#c# #docker #opc-ua
Вопрос:
Я пытаюсь докеризировать клиент C# OPC UA, но, к сожалению, у меня эта ошибка:
Unhandled exception. Opc.Ua.ServiceResultException: Error establishing a connection: BadNotConnected at Opc.Ua.Bindings.ChannelAsyncOperation`1.End(Int32 timeout, Boolean throwOnError) at Opc.Ua.Bindings.UaSCUaBinaryClientChannel.EndSendRequest(IAsyncResult result) at Opc.Ua.Bindings.UaSCUaBinaryTransportChannel.EndSendRequest(IAsyncResult result) at Opc.Ua.Bindings.UaSCUaBinaryTransportChannel.SendRequest(IServiceRequest request) at Opc.Ua.DiscoveryClient.GetEndpoints(RequestHeader requestHeader, String endpointUrl, StringCollection localeIds, StringCollection profileUris, EndpointDescriptionCollectionamp; endpoints) at Opc.Ua.DiscoveryClient.GetEndpoints(StringCollection profileUris) at Opc.Ua.Client.CoreClientUtils.SelectEndpoint(String discoveryUrl, Boolean useSecurity, Int32 discoverTimeout) at client.Program.OPCUAClass.InitializeOPCUAClient() in C:UsersmyuserDesktopclientProgram.cs:line 182 at client.Program.OPCUAClass..ctor(String serverAddres, String serverport, Dictionary`2 taglist, Boolean sessionrenewalRequired, Double sessionRenewalMinutes, String nameSpace) in C:UsersmyuserDesktopclientProgram.cs:line 98 at client.Program.Main(String[] args) in C:UsersmyuserDesktopclientProgram.cs:line 58
У кого-нибудь уже была эта ошибка? Или кто-нибудь уже докеризовал клиент C#, знает, как в этом случае должен быть написан файл dockerfile?
У клиента нет интерфейса, но он печатает узлы только на терминале при изменении данных. Обычно я использую команду dotnet run для запуска клиента. Это мой док-файл:
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal COPY bin/Release/net6.0/publish/ App/ COPY tagsList.txt App/ WORKDIR /App ENTRYPOINT ["dotnet", "client.dll"]
А вот строки Program.cs с ошибками:
58: myOPCUAServer = new OPCUAClass(endpointURL, "62541", TagList, true, 1, "4");
98: InitializeOPCUAClient();
182: application.CheckApplicationInstanceCertificate(false, 2048).GetAwaiter().GetResult();
Я уже пытался изменить адрес opc с localhost на 0.0.0.0, но ничего не изменилось.
Комментарии:
1. 0.0.0.0 никогда не сработает. Когда вы видите, что упомянуто в сети, всегда указывается, с каких IP-адресов следует принимать соединения , и 0.0.0.0 означает всех. Вы являетесь клиентом, и вам необходимо указать адрес вашего сервера OPC UA. Localhost не работает, так как localhost-это контейнер, в котором запущено ваше приложение. Где работает ваш сервер OPC UA?
2. Сервер (устройство имитатора зажигания) работает на моем компьютере, и по этой причине я использовал localhost(127.0.0.1)
3. ОК. Если вашим хостом является Windows или Mac, попробуйте
host.docker.internal
. Если вашим хостом является Linux, то используйте172.17.0.1
. Это должен быть адрес главной машины.4. Где я должен использовать host.docker.internal? В моем адресе сервера? («opc.tcp://host.docker.внутренний:62541»)
5. ДА. Это сетевой адрес хост — машины внутри контейнера.