服务MyServicePkg

时间:2018-02-13 17:08:12

标签: c# .net visual-studio-2017 azure-service-fabric

我正在尝试升级我的应用程序:

enter image description here

失败并出现以下错误:

enter image description here

错误详情:

  

2> Test-ServiceFabricApplicationPackage:应用程序的BuildLayout   2> C:\ Users \ me \ AppData \ Local \ Temp \ TestApplicationPackage_2205895293421 \ 4myc2vpp.bdq \ Debug无效。代码是
  2>服务MyServicePkg缺失。
  2>在C:\ Program Files \ Microsoft SDKs \ Service
  2> Fabric \ Tools \ PSModule \ ServiceFabricSDK \ Publish-UpgradedServiceFabricApplication.ps1:135 char:38
  2> + ... nSuccess =(Test-ServiceFabricApplicationPackage $ AppPkgPathToUse -Im ...
  2> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~
  2 - ; + CategoryInfo:InvalidOperation:(:) [Test-ServiceFabricApplicationPackage],FabricImageBuilderValidati
  2 - ; onException的
  2 - ; + FullyQualifiedErrorId:TestApplicationPackageErrorId,Microsoft.ServiceFabric.Powershell.TestApplicationPackage   2 - ;
  2>完成执行脚本'Deploy-FabricApplication.ps1'   2>时间流逝:00:00:40.4035177
  2> PowerShell脚本无法执行   ==========构建:1成功,0失败,46最新,0跳过==========
  ==========发布:0成功,1失败,0跳过==========

以下是该特定项目的属性:

enter image description here

我做错了什么?这个例外是什么意思?

3 个答案:

答案 0 :(得分:3)

我会选择Hans Passant的评论:

  

最基本的不幸是你在名字中使用的名字   ServiceManifest.xml文件与您的.exe名称不匹配   项目生成

在调试输出中也可以看到它,因为构建成功但发布失败。

  

==========构建:1成功,0失败,46最新,0跳过==========   ==========发布:0成功,1失败,0跳过==========

它可能以多种方式发生,很可能是由于重命名项目或重命名Assembly Name。如果重命名项目或项目的Assembly Name,则构建可执行文件将根据该名称。请考虑以下情况。

Application Properties

我将Assembly Name从“MyService”重命名为“MyRenamedService”。因此构建可执行文件将是MyRenamedService.exe。因此,您必须在ServiceManifest.xml

中进行设置
<CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>MyRenamedService.exe</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
</CodePackage>

确保构建可执行路径的最佳方法是构建解决方案。它将在“输出”窗口中显示可执行文件的完整路径。

1>------ Build started: Project: Web1, Configuration: Debug Any CPU ------
1>Web1 -> C:\.....\Application2\Web1\bin\Debug\net461\win7-x64\MyRenamedService.exe
2>------ Build started: Project: Application2, Configuration: Debug x64 ------
========== Build: 2 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

这里Web1是我开始使用的项目名称,MyRenamedService.exe是构建可执行文件名(因为我重命名了程序集名称),它应该在ServiceManifest.xml中设置,如上所示

答案 1 :(得分:2)

在更高级别,当发布期间ServiceFabric项目文件夹下缺少名为“Code”的文件夹时(构建显示为成功完成后),会发生此错误。

构建是这里的罪魁祸首,而不是Publish,因为Publish应该寻找资产 Folder Path: {{SFProjectFolder}}\pkg\Release\{{ServiceName}}

请注意,{{ServiceName}}和“Code”取自SF应用程序中引用的相应项目的ServiceManifest.xml。

ServiceManifest.xml

<ServiceManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="{{ServiceName}}" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="{{ServiceType}}" />
  </ServiceTypes>
  <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>{{ServiceName}}.exe</Program>
      </ExeHost>
    </EntryPoint>
  </CodePackage>
  <ConfigPackage

  • 导致问题的原因 : 从其他答案看,看起来Build不会将编译后的资产复制到正确的路径/文件夹中,可能由于多个问题而发生。 在我们的示例中,我们已将Release Configuration的Configuration Manager设置从AnyCPU更改为x64,并从解决方案中删除了AnyCPU Platform设置。由于某种原因,Services.csproj仍然具有AnyCPU平台设置。我们最终让构建显示为成功,但“Release”文件夹未在Release文件夹下生成。

  • <强> 修正 : 要解决此问题,我们必须手动编辑.csproj并删除仍使用“AnyCPU”的PropertyGroup部分,如下所示:
    PropertyGroup Condition =“'$(Configuration)| $(Platform)'=='Release | AnyCPU'”

在此更改之后,Build正确地将内容放在正确的路径中,Publish按预期工作。

答案 2 :(得分:1)

ServiceManifest.xml 中的服务的可执行.exe路径出错时,会出现此问题。

<CodePackage>.exe中包含<Program>路径,请先检查一下:

<CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>MyServicePkgHost.exe</Program> // Important
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
</CodePackage>

重要参考资料:

如果确认您没有遗漏任何内容,请查看two tutorials下面的内容:

编辑1: -

您的package layout应用程序目录结构应为:

PS D:\temp> tree /f .\MyServicePkg

D:\TEMP\MYSERVICEPKG
│   ApplicationManifest.xml
│
└───MyServicePkgManifest
    │   ServiceManifest.xml
    │
    ├───MyServicePkg
    │       MyServicePkgHost.exe
    │
    ├───MyServicePkgConfig
    │       Settings.xml
    │
    └───MyServicePkgData
            init.dat

错误:

  

为什么服务包&#34; 缺少&#34;代码?

原因:

在上面的目录中,缺少来自应用程序目录的.bat代码文件:

│
├───MyServicePkg
│       MyServicePkgHost.exe
│       MyServicePkgSetup.bat
|

所以你必须添加那个丢失的文件MyServicePkgSetup.bat。以下是一个简单的service manifest ServiceManifest.xml 示例,其中显示了该服务的SetupEntryPoint和主EntryPoint

<?xml version="1.0" encoding="utf-8" ?>
<ServiceManifest Name="MyServiceManifest" Version="SvcManifestVersion1" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Description>An example service manifest</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="MyServiceType" />
  </ServiceTypes>
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>MyServicePkgSetup.bat</Program> // important
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </SetupEntryPoint>
    <EntryPoint>
      <ExeHost>
        <Program>MyServicePkgHost.exe</Program> // important
      </ExeHost>
    </EntryPoint>
  </CodePackage>
  <ConfigPackage Name="Config" Version="1.0.0" />
</ServiceManifest>

Configure the policy by using a local account

将服务配置为具有设置入口点后,您可以更改其在应用程序清单中运行的安全权限

<ServiceManifestImport>部分下,配置策略以将此主体应用于<SetupEntryPoint>。这告诉Service Fabric在运行MyServicePkgSetup.bat文件时,它应该是具有管理员权限的 RunAs 。鉴于您尚未将策略应用于主入口点,MyServicePkgHost.exe中的代码将在系统 NetworkService 帐户下运行。这是所有服务入口点都作为默认帐户运行。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <ServiceManifestImport>
      <ServiceManifestRef ServiceManifestName="MyServiceTypePkg" ServiceManifestVersion="1.0.0" />
      <ConfigOverrides />
      <Policies>
         <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
      </Policies>
   </ServiceManifestImport>
   <Principals>
      <Users>
         <User Name="SetupAdminUser">
            <MemberOf>
               <SystemGroup Name="Administrators" />
            </MemberOf>
         </User>
      </Users>
   </Principals>
</ApplicationManifest>

PS:您可以使用Test-ServiceFabricApplicationPackage命令通过PowerShell在本地验证包结构。

添加丢失文件MyServicePkgSetup.bat的解决方法:

  1. 现在让我们将文件MyServicePkgSetup.bat添加到Visual Studio项目以测试管理员权限。在Visual Studio中,右键单击服务项目并添加名为MyServicePkgSetup.bat的新文件。

  2. 接下来,确保服务包中包含MyServicePkgSetup.bat文件。默认情况下,它不是。选择文件右键单击以获取上下文菜单,然后选择属性。在“属性”对话框中,确保复制到输出目录设置为复制更新。请参阅以下屏幕截图:

    enter image description here

      

    **文件路径:** C:\..\YourApplication\

  3. 现在打开 MyServicePkgSetup.bat文件并添加以下命令:

    REM Set a system environment variable. This requires administrator privilege
    setx -m TestVariable "MyValue"
    echo System TestVariable set to > out.txt
    echo %TestVariable% >> out.txt
    
    REM To delete this system variable us
    REM REG delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TestVariable /f
    
  4. 接下来,构建解决方案并将其部署到本地开发群集。服务启动后,如Service Fabric Explorer中所示,您可以通过两种方式看到MySetup.bat文件成功。打开PowerShell命令提示符并键入:

    PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
    MyValue
    
  5. 然后,记下在Service Fabric Explorer中部署和启动服务的节点的名称 - 例如,节点2.接下来,导航到应用程序实例工作文件夹以查找out.txt文件显示TestVariable的值。例如,如果将此服务部署到节点2,那么您可以转到MyApplicationType的此路径:

    C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt