【问题标题】:Code is missing for service MyServicePkg缺少服务 MyServicePkg 的代码
【发布时间】:2018-07-24 03:12:40
【问题描述】:

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

它失败并出现以下错误:

错误详情:

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> 异常
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 跳过 ==========

这是我针对该特定项目的属性:

我做错了什么?这个异常是什么意思?

【问题讨论】:

  • 你重命名你的项目了吗?
  • 最基本的问题是您在ServiceManifest.xml 文件中使用的名称与您的项目生成的.exe 的名称不匹配。我们看不到它,“MyServicePkg”听起来太笼统了,以至于很可能缺少编辑。值得注意的是,将解决方案平台强制使用 x64 永远是个麻烦事,应该构建 .NET 代码以针对 AnyCPU。
  • 如果您发布 ServiceManifext.xml 和 ApplicationManifest.xml 可能更容易帮助您。

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


【解决方案1】:

当您的服务的可执行文件 .exeServiceManifest.xml 中的路径错误时会出现此问题。

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

<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

错误:

为什么会出现“服务包代码缺失”

原因:

在上面的目录中,您的应用程序目录中缺少.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

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

&lt;ServiceManifestImport&gt; 部分下,配置一个策略以将此主体应用于&lt;SetupEntryPoint&gt;。这告诉 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 文件包含在服务包中。默认情况下,它不是。选择文件右键单击以获取上下文菜单,然后选择Properties。在“属性”对话框中,确保将复制到输出目录设置为如果较新则复制。请看以下截图:

    **文件路径:**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 文件的测试变量。例如,如果此服务部署到节点 2,那么您可以转到 MyApplicationType 的此路径:

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

【讨论】:

  • TheProject.Identity.Service.exe in
  • 对不起,我不明白,你说 TheProject.Identity.Service.exe 将是正确的文件名,但问题是 我们如何知道这个值应该是多少?
【解决方案2】:

我会同意 Hans Passant 的评论:

最基本的错误是您在 ServiceManifest.xml 文件与您安装的 .exe 的名称不匹配 项目生成

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

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

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

我将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是我开始使用的Project Name,MyRenamedService.exe是构建可执行文件名(因为我重命名了Assembly Name),如上图应该设置在ServiceManifest.xml中。

【讨论】:

    【解决方案3】:

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

    这里的罪魁祸首是构建,而不是发布,因为发布预计会在下面查找资产 Folder Path: {{SFProjectFolder}}\pkg\Release\{{ServiceName}}

    请注意,{{ServiceName}} 和“代码”取自 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 文件夹下生成“代码”文件夹。

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

    在此更改之后,Build 将内容正确放置在正确的路径中,并且 Publish 正常工作。

    【讨论】:

    • 不错的答案,我猜servicemanifestname 你的意思是servicename
    • @MunimMunna 谢谢..我已经更正了..我的意思是 ServiceManifest xml 中 Name 属性的值
    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2020-02-05
    相关资源
    最近更新 更多