Исключение при попытке создания контейнера и публикации sh StatelessService в Service Fabric - PullRequest
1 голос
/ 28 марта 2020

У меня есть. 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 класса никогда не выполняются. Это означает, что не вызывается даже конструктор.

Есть что-то, что я мог бы упустить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...