Соединение с веб-сервером Watson lite отклоненоC#

Место общения программистов C#
Ответить
Anonymous
 Соединение с веб-сервером Watson lite отклонено

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/784 ... on-refused
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»