У меня есть. NET Core Reliable Service, которая в значительной степени является службой шаблонов, полученной из Add> New Service Fabri c Service>. NET Core Stateless Service. Это означает, что он содержит ServiceEventSource
, класс Stateless1
, который наследуется от класса StatelessService
, и Program.cs
. Содержимое Program.cs
является значением по умолчанию:
private static void Main()
{
try
{
ServiceRuntime.RegisterServiceAsync("Stateless1Type",
context => new Stateless1(context)).GetAwaiter().GetResult(); ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Stateless1).Name);
Thread.Sleep(Timeout.Infinite);
}
catch (Exception e)
{ ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}
Теперь все работает нормально, я могу правильно запустить приложение Service Fabri c и посмотреть журналы и т. Д. c.
То, что я пытаюсь выполнить sh, заключается в контейнеризации этой службы согласно следующей статье: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-services-inside-containers. Это означает, что я добавил SFBinaryLoader.cs и добавил следующий файл в мой Program.cs
:
static Program()
{
SFBinaryLoader.Initialize();
}
Однако, при этом возникает много вопросов и проблем, которые не возникают. t рассматривается в документации.
Я использую microsoft/service-fabric-reliableservices-windowsservercore:1803
в качестве базового образа для построения моего контейнера. Это так, поскольку хост сервера windows имеет версию 1803. После запуска CreateDockerPackage.ps1 я заметил, что Microsoft.ServiceFabric.Data.Interfaces.dll
и System.Fabric.*.dll
удаляются.
Я думаю, именно поэтому мы должны быть снова снабжены во время выполнения. Это выполняется SFBinaryLoader.cs
путем добавления прослушивателя событий на AppDomain.CurrentDomain.AssemblyResolve
. Этот класс должен смотреть на переменную окружения FabricCodePath
(которая во время выполнения выглядит как привязка к каталогу C:\SFFabricBin\
) и вручную добавлять эти двоичные файлы.
Я бы сказал, что для запуска программы мне пришлось также удалить файл *.deps.json
из контейнера, потому что я получал исключение еще до запуска dotnet Stateless1.dll
о том, что некоторые недостающие двоичные файлы заявленные в файле *.deps.json
не найдены.
Теперь, похоже, что мой контейнер нормально запускается fabri c, и что сборки загружаются правильно. Однако всякий раз, когда вы пытаетесь зарегистрировать сервис на fabri c по следующей строке:
ServiceRuntime.RegisterServiceAsync("Stateless1Type",
context => new Stateless1(context)).GetAwaiter().GetResult();
Выдается следующее исключение:
Исключение происходит при регистрации системы сервиса .Fabri c .FabricException: тип сервиса уже зарегистрирован. ---> System. c__DisplayClass22_0.b__0 (контекст IFabricAsyncOperationContext) в System.Fabri c .Interop.AsyncCallOutAdapter2 1.Finish(IFabricAsyncOperationContext context, Boolean expectedCompletedSynchronously)
--- End of inner exception stack trace ---
at Microsoft.ServiceFabric.Services.Runtime.ServiceRuntime.RegisterServiceAsync(String serviceTypeName, Func
2 serviceFactory, тайм-аут TimeSpan, CancellationToken cancellationToken) в Eventellect.Fabri c .Test Docker .Test *1076* .Test *1076* .Test *1076* .Test *1076* .Test *1076* .Test *1076* .Test *1076* .Tест 1047 *C: \ MyLocalPath \ StatelessService \ Program.cs: строка 33
Знаете ли вы, почему это происходит? Я также нахожу очень странным, что каким-то образом мой опубликованный сервис fabri c вообще ничего не знает о моем локальном пути.
Я уже окружил вызов RegisterServiceAsync
внутри блока try...catch
, но затем, несмотря на то, что поток успешно засыпает и мой docker контейнер не останавливается, действия внутри моего Stateless1.cs
класса никогда не выполняются. Это означает, что не вызывается даже конструктор.
Есть что-то, что я мог бы упустить?