Я использую Docker-контейнер с двумя приложениями внутри. Первое приложение — это веб-API в .net 7, которое запускает второе приложение (с использованием метода Process Start()). Второе приложение — веб-сервер Watson lite (консольное приложение). Веб-сервер Watson lite прослушивает адрес 127.0.0.1:9000. После запуска веб-сервера Watson lite приложение web api .net 7 отправляет почтовый запрос на адрес http://127.0.0.1:9000/calculate/ — веб-сервер Watson lite выполняет вычисления и возвращает ответ. Если вы протестируете такую конфигурацию в Windows 11, все будет работать нормально, но если вы создадите и запустите Docker-контейнер, веб-API .net 7 успешно запустит веб-сервер Watson lite, но когда приложение веб-API .net 7 попытается отправить при запросе к http://127.0.0.1:9000/calculate/ возвращается ошибка: Соединение отклонено (127.0.0.1:9000).
В чем может быть ошибка?
.net 7 веб-API-приложение запускается как основной процесс с помощью команды docker ENTRY POINT.
Я пытался запустить Watson lite, указав адрес 0.0.0.0 вместо 127.0.0.1 или просто *. Ничего не помогает...
Может быть что-то не так с правами доступа пользователей? Я попадаю в рабочий докер-контейнер, и с помощью команды curl все работает нормально...
Вот пример кода для веб-сервера Watson lite в консольном приложении:
internal class Program
{
private static CancellationTokenSource cts = new CancellationTokenSource();
static async Task Main(string[] args)
{
// define host:
string host = "+";
// define port:
int port = 9000;
// set up web server settings:
WebserverSettings settings = new WebserverSettings(host, port, false);
// create watson lite web server:
WebserverLite server = new WebserverLite(settings, DefaultRoute);
try
{
// set up CalculateRoute:
server.Routes.PreAuthentication.Parameter.Add(WatsonWebserver.Core.HttpMethod.POST, "/calculate/", CalculateRoute);
// set up StopRoute:
server.Routes.PreAuthentication.Parameter.Add(WatsonWebserver.Core.HttpMethod.GET, "/stop/", StopRoute);
// start server:
server.Start();
// wait for cancellation token to cancel:
await Task.Delay(-1, cts.Token);
}
catch (Exception exception)
{
// if there some exception occured or calcullation token canceled,
// then stop the server:
server.Stop();
}
finally
{
// release resources:
cts.Dispose();
}
}
/// perform calculations:
private static async Task CalculateRoute(HttpContextBase ctx)
{
// get task as json string:
string inputJson = ctx.Request.DataAsString;
// perform calculations:
string result = Calculate(inputJson);
// return the result:
await ctx.Response.Send(result);
}
/// stop web server
private static async Task StopRoute(HttpContextBase ctx)
{
cts.Cancel();
await ctx.Response.Send("Sent stop signal to server");
}
}
Приложение Web api .net 7 (основная точка входа в контейнере докеров):
[ApiController]
[Route("solve/")]
public async Task Post(SolveTaskInputDto calculatorModel, int id, CancellationToken ct)
{
try
{
// create Process object:
using Process prs = new Process();
// fill data:
// path to executable file for console app (with Watson lite web server inside):
prs.StartInfo.FileName = pathToWatsonLiteExecutableFile;
prs.StartInfo.UseShellExecute = false;
prs.StartInfo.RedirectStandardOutput = true;
// start Watson Lite web server:
prs.Start()
// create query body:
HttpContent httpContent = new StringContent(
JsonConvert.SerializeObject(calculatorModel),
// use UTF8 encoding
Encoding.UTF8,
// and json data format:
"application/json");
// send post query:
HttpResponseMessage response = await _httpClient.PostAsync("http://127.0.0.1:9000/calculate/", httpContent, ct);
response.EnsureSuccessStatusCode();
// get data as string:
string result = await response.Content.ReadAsStringAsync(ct);
// return result:
return new JsonResult(resultDto);
}
catch(Exception exp)
{
return new JsonResult(exp.Message);
}
}
Dockerfile:
# ====== .NET CORE SDK ======
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
COPY my_nuget_packages/*.nupkg /nuget_local/
# Add package sources
RUN echo "\
\
\
\
\
\
\
\
" > ${HOME}/CustomNuGet.config
# ====== Web.Api ======
WORKDIR /source_api
ARG api_project_prefix=Web.Api
# ====== restore ======
COPY ${api_project_prefix}/*.sln ./
COPY ${api_project_prefix}/Web.Api/*.csproj ./Web.Api/
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1
RUN dotnet restore\
--configfile ${HOME}/CustomNuGet.config\
--packages /nuget/packages\
Web.Api\
-r linux-x64\
--no-cache
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# copy everything else and build app
COPY ${api_project_prefix}/ .
# ====== build ======
RUN dotnet build\
Web.Api\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== publish ======
RUN dotnet publish\
Web.Api\
-o /published/api\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--no-build\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== Watson.App.Console ======
WORKDIR /source_watson_console
ARG watson_console_project_prefix=Watson.App.Console
# ====== restore ======
COPY ${watson_console_project_prefix}/*.sln ./
COPY ${watson_console_project_prefix}/Watson.App.Console/*.csproj ./Watson.App.Console/
RUN dotnet restore\
--configfile ${HOME}/CustomNuGet.config\
--packages /nuget/packages\
Watson.App.Console\
-r linux-x64\
--no-cache
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# copy everything else and build app
COPY ${watson_console_project_prefix}/ .
# ====== build ======
RUN dotnet build\
Watson.App.Console\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== publish ======
RUN dotnet publish\
Watson.App.Console\
-o /published/cas_console\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--no-build\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== ASPNET CORE RUNTIME ======
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN addgroup --system --gid 1000 dotnet && adduser --system --gid 1000 dotnet
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1\
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false\
DOTNET_USE_POLLING_FILE_WATCHER=true\
TZ=Europe/Moscow\
LC_ALL=ru_RU.UTF-8\
LANG=ru_RU.UTF-8\
DOTNET_RUNNING_IN_CONTAINER=true
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app_watson_console
COPY --from=build /published/watson_console ./
WORKDIR /app_api
COPY --from=build /published/api ./
RUN mkdir data
# ====== production ======
EXPOSE 8065
ENTRYPOINT ["./Web.Api"]
И файл Docker Compose:
version: '3.9'
name: web-api
networks:
web-api-network:
services:
seq:
image: datalust/seq:latest
container_name: seq-container
volumes:
- /seq/data:/data
environment:
ACCEPT_EULA: "Y"
ports:
- "15432:80" # for UI
restart: always
networks:
- web-api-network
web-api:
image: web-api:12-05-2023-v-1
container_name: web-api-container-v-1
volumes:
- /web/api/data:/app_api/data
environment:
ASPNETCORE_ENVIRONMENT: "Production"
ASPNETCORE_URLS: "http://+:8065"
Logging__Console__FormatterName: "Simple"
SeqSettings__SeqHost: "http://seq:5341"
PathToWatsonLiteExecutableFile__AppPath: "/app_cas_console/Watson.App.Console"
ports:
- "18065:8065"
restart: always
networks:
- web-api-network
depends_on:
- seq
Подробнее здесь: https://stackoverflow.com/questions/784 ... on-refused
Соединение с веб-сервером Watson lite отклонено ⇐ C#
Место общения программистов C#
-
Anonymous
1715718098
Anonymous
Я использую Docker-контейнер с двумя приложениями внутри. Первое приложение — это веб-API в .net 7, которое запускает второе приложение (с использованием метода Process Start()). Второе приложение — веб-сервер Watson lite (консольное приложение). Веб-сервер Watson lite прослушивает адрес 127.0.0.1:9000. После запуска веб-сервера Watson lite приложение web api .net 7 отправляет почтовый запрос на адрес http://127.0.0.1:9000/calculate/ — веб-сервер Watson lite выполняет вычисления и возвращает ответ. Если вы протестируете такую конфигурацию в Windows 11, все будет работать нормально, но если вы создадите и запустите Docker-контейнер, веб-API .net 7 успешно запустит веб-сервер Watson lite, но когда приложение веб-API .net 7 попытается отправить при запросе к http://127.0.0.1:9000/calculate/ возвращается ошибка: Соединение отклонено (127.0.0.1:9000).
В чем может быть ошибка?
.net 7 веб-API-приложение запускается как основной процесс с помощью команды docker ENTRY POINT.
Я пытался запустить Watson lite, указав адрес 0.0.0.0 вместо 127.0.0.1 или просто *. Ничего не помогает...
Может быть что-то не так с правами доступа пользователей? Я попадаю в рабочий докер-контейнер, и с помощью команды curl все работает нормально...
Вот пример кода для веб-сервера Watson lite в консольном приложении:
internal class Program
{
private static CancellationTokenSource cts = new CancellationTokenSource();
static async Task Main(string[] args)
{
// define host:
string host = "+";
// define port:
int port = 9000;
// set up web server settings:
WebserverSettings settings = new WebserverSettings(host, port, false);
// create watson lite web server:
WebserverLite server = new WebserverLite(settings, DefaultRoute);
try
{
// set up CalculateRoute:
server.Routes.PreAuthentication.Parameter.Add(WatsonWebserver.Core.HttpMethod.POST, "/calculate/", CalculateRoute);
// set up StopRoute:
server.Routes.PreAuthentication.Parameter.Add(WatsonWebserver.Core.HttpMethod.GET, "/stop/", StopRoute);
// start server:
server.Start();
// wait for cancellation token to cancel:
await Task.Delay(-1, cts.Token);
}
catch (Exception exception)
{
// if there some exception occured or calcullation token canceled,
// then stop the server:
server.Stop();
}
finally
{
// release resources:
cts.Dispose();
}
}
/// perform calculations:
private static async Task CalculateRoute(HttpContextBase ctx)
{
// get task as json string:
string inputJson = ctx.Request.DataAsString;
// perform calculations:
string result = Calculate(inputJson);
// return the result:
await ctx.Response.Send(result);
}
/// stop web server
private static async Task StopRoute(HttpContextBase ctx)
{
cts.Cancel();
await ctx.Response.Send("Sent stop signal to server");
}
}
Приложение Web api .net 7 (основная точка входа в контейнере докеров):
[ApiController]
[Route("solve/")]
public async Task Post(SolveTaskInputDto calculatorModel, int id, CancellationToken ct)
{
try
{
// create Process object:
using Process prs = new Process();
// fill data:
// path to executable file for console app (with Watson lite web server inside):
prs.StartInfo.FileName = pathToWatsonLiteExecutableFile;
prs.StartInfo.UseShellExecute = false;
prs.StartInfo.RedirectStandardOutput = true;
// start Watson Lite web server:
prs.Start()
// create query body:
HttpContent httpContent = new StringContent(
JsonConvert.SerializeObject(calculatorModel),
// use UTF8 encoding
Encoding.UTF8,
// and json data format:
"application/json");
// send post query:
HttpResponseMessage response = await _httpClient.PostAsync("http://127.0.0.1:9000/calculate/", httpContent, ct);
response.EnsureSuccessStatusCode();
// get data as string:
string result = await response.Content.ReadAsStringAsync(ct);
// return result:
return new JsonResult(resultDto);
}
catch(Exception exp)
{
return new JsonResult(exp.Message);
}
}
Dockerfile:
# ====== .NET CORE SDK ======
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
COPY my_nuget_packages/*.nupkg /nuget_local/
# Add package sources
RUN echo "\
\
\
\
\
\
\
\
" > ${HOME}/CustomNuGet.config
# ====== Web.Api ======
WORKDIR /source_api
ARG api_project_prefix=Web.Api
# ====== restore ======
COPY ${api_project_prefix}/*.sln ./
COPY ${api_project_prefix}/Web.Api/*.csproj ./Web.Api/
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1
RUN dotnet restore\
--configfile ${HOME}/CustomNuGet.config\
--packages /nuget/packages\
Web.Api\
-r linux-x64\
--no-cache
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# copy everything else and build app
COPY ${api_project_prefix}/ .
# ====== build ======
RUN dotnet build\
Web.Api\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== publish ======
RUN dotnet publish\
Web.Api\
-o /published/api\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--no-build\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== Watson.App.Console ======
WORKDIR /source_watson_console
ARG watson_console_project_prefix=Watson.App.Console
# ====== restore ======
COPY ${watson_console_project_prefix}/*.sln ./
COPY ${watson_console_project_prefix}/Watson.App.Console/*.csproj ./Watson.App.Console/
RUN dotnet restore\
--configfile ${HOME}/CustomNuGet.config\
--packages /nuget/packages\
Watson.App.Console\
-r linux-x64\
--no-cache
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# copy everything else and build app
COPY ${watson_console_project_prefix}/ .
# ====== build ======
RUN dotnet build\
Watson.App.Console\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== publish ======
RUN dotnet publish\
Watson.App.Console\
-o /published/cas_console\
-c Release\
-r linux-x64\
--packages /nuget/packages\
--no-cache\
--no-restore\
--no-build\
--self-contained true
#/p:PublishSingleFile=true\
#/p:PublishReadyToRun=true
# ====== ASPNET CORE RUNTIME ======
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN addgroup --system --gid 1000 dotnet && adduser --system --gid 1000 dotnet
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1\
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false\
DOTNET_USE_POLLING_FILE_WATCHER=true\
TZ=Europe/Moscow\
LC_ALL=ru_RU.UTF-8\
LANG=ru_RU.UTF-8\
DOTNET_RUNNING_IN_CONTAINER=true
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app_watson_console
COPY --from=build /published/watson_console ./
WORKDIR /app_api
COPY --from=build /published/api ./
RUN mkdir data
# ====== production ======
EXPOSE 8065
ENTRYPOINT ["./Web.Api"]
И файл Docker Compose:
version: '3.9'
name: web-api
networks:
web-api-network:
services:
seq:
image: datalust/seq:latest
container_name: seq-container
volumes:
- /seq/data:/data
environment:
ACCEPT_EULA: "Y"
ports:
- "15432:80" # for UI
restart: always
networks:
- web-api-network
web-api:
image: web-api:12-05-2023-v-1
container_name: web-api-container-v-1
volumes:
- /web/api/data:/app_api/data
environment:
ASPNETCORE_ENVIRONMENT: "Production"
ASPNETCORE_URLS: "http://+:8065"
Logging__Console__FormatterName: "Simple"
SeqSettings__SeqHost: "http://seq:5341"
PathToWatsonLiteExecutableFile__AppPath: "/app_cas_console/Watson.App.Console"
ports:
- "18065:8065"
restart: always
networks:
- web-api-network
depends_on:
- seq
Подробнее здесь: [url]https://stackoverflow.com/questions/78469121/watson-lite-web-server-connection-refused[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия