2016-08-23 1 views
3

При создании приложения ASP.NET Core для вас будет установлена ​​переменная среды ASPNETCORE_ENVIRONMENT=Development, и при отладке вы увидите, что значение IHostingEnvironment установлено на Development. ,переменные основной среды ASP.NET, которые не используются при отладке через проект службы Fabric

Проблема в том, что когда я использую тот же проект в решении, настроенном для Service Fabric, переменные среды, похоже, не вводятся, а IHostingEnvironment просто возвращает «Производство».

Как я могу это решить?

Примечание: Я установил точку останова в классе запуска для наблюдения за переменной IHostingEnvironment.

+1

Что вы сделали с вашим приложением Service Fabric для настройки переменной окружения? Вы делаете «SetupEntryPoint», как описано здесь? https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-model/ –

+0

Я использую Шаблон Service Fabric, предоставленный в Visual Studio. Он правильно имеет служебную запись xml, предварительно сконфигурированную в ServiceManifest. Я указывал переменную окружения в параметрах запуска –

ответ

6

Я столкнулся с тем же вопросом и смог создать решение, которое сработало для меня.

Если вы посмотрите на проект ASP.NET Core, вы должны увидеть файл Program.cs. В нижней части этого вы должны увидеть следующую реализацию интерфейса:

Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken) 
{ 
... 
} 

Вы собираетесь первым хотите, чтобы изменить его на что-то вроде следующего:

Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken) 
{ 
    var context = FabricRuntime.GetActivationContext(); 
    var endpoint = context.GetEndpoint(_endpointName); 
    var config = context.GetConfigurationPackageObject("Config"); 
    var environment = config.Settings.Sections["Environment"].Parameters["ASPNETCORE_ENVIRONMENT"].Value; 

    var serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}"; 

    _webHost = new WebHostBuilder().UseKestrel() 
            .UseContentRoot(Directory.GetCurrentDirectory()) 
            .UseStartup<Startup>() 
            .UseEnvironment(environment) 
            .UseUrls(serverUrl) 
            .Build(); 

    _webHost.Start(); 

    return Task.FromResult(serverUrl); 
} 

Ключевой участок представляет собой .UseEnvironment(environment) вызов , наряду с поддержкой поиска среды из конфигурации. Это даст ASP.NET Core необходимую информацию, необходимую для выбора среды.

Сделав это, вам, очевидно, необходимо добавить параметр ASPNETCORE_ENVIRONMENT в раздел конфигурации. Это выглядит так:

В вашем проекте ASP.NET Core вы найдете каталог с именем PackageRoot/Config. Внутри этого файла должен быть файл Settings.xml. Добавьте следующий код внутри тега <Settings> ...

<Section Name="Environment"> 
    <Parameter Name="ASPNETCORE_ENVIRONMENT" Value="" /> 
</Section> 

Далее, вы собираетесь хотите посмотреть на ApplicationPackageRoot/ApplicationManifest.xml файла внутри фактической службы проекта Fabric (это НЕ проект ASP.NET Core). Требуется два изменения файла.

  1. Добавьте параметр ASPNETCORE_ENVIRONMENT внутри <Parameters> тега в верхней части файла, например, так:

    <Parameter Name="ASPNETCORE_ENVIRONMENT" DefaultValue="" /> 
    
  2. Измените <ServiceManifestImport> тег, чтобы включить <ConfigOverrides> раздел, как так:

    <ConfigOverrides> 
        <ConfigOverride Name="Config"> 
        <Settings> 
         <Section Name="Environment"> 
         <Parameter Name="ASPNETCORE_ENVIRONMENT" Value="[ASPNETCORE_ENVIRONMENT]" /> 
         </Section> 
        </Settings> 
        </ConfigOverride> 
    </ConfigOverrides> 
    

Наконец, внесите изменения ApplicationParameters/Local.1Node.XML и друзей, чтобы содержать ASPNETCORE_ENVIRONMENT параметр:

<Parameter Name="ASPNETCORE_ENVIRONMENT" Value="Development" /> 

Это много шагов, чтобы добавить долбанные переменную, которую можно восстановить, но это позволит вам большую гибкость и следует по стандартной схеме Service Fabric, чтобы сделать простое развертывание. Надеюсь, это поможет!

+0

Спасибо за подробный ответ. Похоже, что вы описываете, как добавить настройки в Service Fabric в целом. Выполнение этого способа будет работать, однако при щелчке правой кнопкой мыши по свойствам проекта для основного проекта asp.net и отключению значения для среды в окне свойств будет отключено. –

+0

@ TheMuffinMan Это правильно, действительно есть разъединение. Простите меня, если я забыл, так как я набрал это, но путь к Project Properties просто не действует при работе в Service Fabric, да? Может быть, я сумасшедший. :) –

0

answer from Duncan работал для меня, но для меня существует небольшая вариация, возможно, из-за версии используемого ядра ASP.NET и служебной ткани.

Мне нужно переопределить метод CreateServiceInstanceListeners в моей службе бездействия в сети. Так это означает, что я буду иметь этот код:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
{ 
    return new ServiceInstanceListener[] 
    { 
     new ServiceInstanceListener(serviceContext => 
      new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => 
      { 
       ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}"); 

       var environment = FabricRuntime.GetActivationContext() 
        ?.GetConfigurationPackageObject("Config") 
        ?.Settings.Sections["Environment"] 
        ?.Parameters["ASPNETCORE_ENVIRONMENT"]?.Value; 

       return new WebHostBuilder().UseWebListener() 
        .ConfigureServices(
         services => services 
          .AddSingleton<StatelessServiceContext>(serviceContext)) 
        .UseContentRoot(Directory.GetCurrentDirectory()) 
        .UseStartup<Startup>() 
        .UseEnvironment(environment) 
        .UseApplicationInsights() 
        .UseUrls(url) 
        .Build(); 
      })) 
    }; 
} 

Конечно, вам нужно установить переменную ASPNETCORE_ENVIRONMENT как пояснил Дункан.

10

Ссылка на этот ответ: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-manage-multiple-environment-app-configuration

Я столкнулся с той же проблемой с шаблоном по умолчанию. Следующее похоже на ответ Дункана, но с двумя важными отличиями: 1) вам не придется менять код шаблона внутри службы, а 2) правильно установить IHostingEnvironment.

Во-первых, добавьте переменную ASPNETCORE_ENVIRONMENT к <CodePackage> элементу PackageRoot\ServiceManifest.xml файла службы приложения:

<CodePackage Name="Code" Version="1.0.0"> 
    <EntryPoint> 
    <ExeHost> 
     <Program>MyService.exe</Program> 
     <WorkingFolder>CodePackage</WorkingFolder> 
    </ExeHost> 
    </EntryPoint> 
    <EnvironmentVariables> 
    <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value=""/> 
    </EnvironmentVariables> 
</CodePackage> 

Как и в ответ на Дункана, есть два изменения вы вносите в ApplicationManifest.xml вашей службы ткани Проект приложения. Сначала настройте параметр (переменную), чтобы его можно было изменить при замене файлов ApplicationParameters на основе способа развертывания проекта. Затем добавьте раздел EnvironmentalOverrides в ваш элемент ServiceManifestImport. Результаты двух дополнений будет выглядеть примерно так:

<Parameters> 
    <Parameter Name="MyService_InstanceCount" DefaultValue="-1" /> 
    <Parameter Name="AspNetCoreEnvironment" DefaultValue="" /> 
</Parameters> 

<ServiceManifestImport> 
    <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" /> 
    <EnvironmentOverrides CodePackageRef="Code"> 
    <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="[AspNetCoreEnvironment]" /> 
    </EnvironmentOverrides> 
</ServiceManifestImport> 

Наконец, вы можете добавить в соответствующих значений в отдельных ApplicationParameters файлов:

<Parameters> 
    <Parameter Name="MyService_InstanceCount" Value="-1" /> 
    <Parameter Name="AspNetCoreEnvironment" Value="Development" /> 
</Parameters> 

На данный момент, вы можете удалить переменную из свойств сервиса - Отладка переменных окружения.

+2

Поскольку «EnvironmentVariables» - это новая функция в Service Fabric, я думаю, что это самое элегантное решение. – fgauna