Простой веб-сервер
Настройка простого веб-сервера
Простой веб-сервер
Это сервер внутри верхнеуровневого C# Script EyeAuras, а не отдельный ASP.NET-проект. Хост должен уметь загрузить все перечисленные assemblyName и совместимый ASP.NET Core runtime. Порт 52080 должен быть свободен. В примере используется HTTP; номер 52443 сам по себе не включает HTTPS — для него нужны отдельные настройки сертификата и endpoint.
Вы можете поднять и запустить собственный локальный веб-сервер, который будет доступен другим пользователям. Это может быть полезно, если нужно посмотреть, что сейчас происходит внутри экземпляра EA, или удалённо управлять какими-то параметрами.
Код для создания и запуска сервера довольно объёмный, но при необходимости его можно просто скопировать и использовать как основу.
Что нужно сделать
Чтобы всё заработало, потребуется несколько шагов:
- подключить нужные сборки, в которых находится сам веб-сервер. Для этого используются ссылки типа
assemblyName - добавить пространства имён с классами, которые понадобятся для запуска сервера
- настроить сам сервер и, что особенно важно,
routes— именно они определяют, что сервер будет возвращать при обращении к конкретным страницам - выбрать свободный порт. Для HTTP подойдёт
52080, для HTTPS —52443, но при желании вы можете использовать любые другие
Пример
Готовый пример можно импортировать отсюда: https://eu.eyeauras.net/share/S20250302232655ULHlLljgYANa
- Создайте ауру со скриптом.
- Скопируйте код ниже, вставьте и запустите его. В консоли должна появиться строка
Starting web-server— после неё ещё может произойти ошибка запуска. - Проверьте ответ
curl http://127.0.0.1:52080/hello— ожидаетсяHello, world!(в варианте с контроллерами —Hello World!).
Как это можно использовать?
Самый очевидный вариант — удалённо управлять тем, что происходит в EA, или отдавать куда-то данные, которые собирает EA: например, результаты image searchers, text searcher и т. д. Эти данные может опрашивать другой экземпляр EA или какой-нибудь внешний скрипт.
Ещё один вариант — управление вашим injection-based ботом через такой сервер. Поскольку это полноценный веб-сервер, поверх него можно построить практически любой транспорт.

Script.csx
#r "assemblyName: Microsoft.AspNetCore"
#r "assemblyName: Microsoft.AspNetCore.Hosting"
#r "assemblyName: Microsoft.Extensions.Hosting"
#r "assemblyName: Microsoft.AspNetCore.Routing"
#r "assemblyName: Microsoft.AspNetCore.Server.Kestrel.Core"
#r "assemblyName: Microsoft.AspNetCore.Http.Abstractions"
#r "assemblyName: Microsoft.AspNetCore.Hosting.Abstractions"
#r "assemblyName: Microsoft.AspNetCore.Server.Kestrel"
#r "assemblyName: Microsoft.AspNetCore.Mvc.Core"
#r "assemblyName: Microsoft.AspNetCore.Mvc"
#r "assemblyName: Microsoft.Extensions.Configuration.Abstractions"
#r "assemblyName: Microsoft.AspNetCore.Routing.Abstractions"
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Routing;
using System;
const int PortNumber = 52080;
{
Log.Info("Creating web-app builder");
var builder = Host
.CreateDefaultBuilder()
.ConfigureAppConfiguration((context, config) =>
{
//Very important line!
//This is required to run the server in EA infrastructure
config.Sources.Clear();
})
.ConfigureWebHostDefaults(webBuilder =>
{
Log.Info("Setting up web-options");
webBuilder
.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(endpointOptions => { endpointOptions.Protocols = HttpProtocols.Http1; });
serverOptions.ListenAnyIP(PortNumber, listenOptions => { listenOptions.Protocols = HttpProtocols.Http1AndHttp2; });
})
.Configure((ctx, app) =>
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/hello", () =>
{
//that could be any kind of code
return "Hello, world!";
});
});
});
});
Log.Info("Building web-server");
using var host = builder.Build();
Log.Info("Starting web-server");
await host.RunAsync(cancellationToken);
Log.Info("Terminated");
}
ListenAnyIP слушает доступные сетевые интерфейсы, а не только loopback. Доступ с другой машины зависит от сети и firewall. RunAsync(cancellationToken) связывает работу хоста с остановкой скрипта; уже запущенные обработчики и внешние операции имеют собственные правила завершения. HTTP-контейнер services создаётся отдельно от контейнера EyeAuras: сервисы скрипта не появляются в контроллерах автоматически. config.Sources.Clear() оставляет явную настройку этого примера; оно не гарантирует совместимость любой версии ASP.NET.
Дальше
Контекст скрипта · Хостинг HTTP · Ссылки на сборки
Контракты сверены со срезом EyeAuras 20fd3d4 и PoeEye 0e02c98. Полные сигнатуры смотрите в SDK/XML своей версии; наличие символа не подтверждает доступность внешнего пакета или нативного компонента. Пример здесь не проверялся компиляцией или запуском.