当您的服务的可执行文件 .exe 在 ServiceManifest.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>
将服务配置为具有设置入口点后,您可以在应用程序清单中更改其运行的安全权限:
在<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的解决方法:
现在让我们将文件MyServicePkgSetup.bat 添加到 Visual Studio 项目中以测试管理员权限。在 Visual Studio 中,右键单击服务项目并添加一个名为 MyServicePkgSetup.bat 的新文件。
-
接下来,确保MyServicePkgSetup.bat 文件包含在服务包中。默认情况下,它不是。选择文件,右键单击以获取上下文菜单,然后选择Properties。在“属性”对话框中,确保将复制到输出目录设置为如果较新则复制。请看以下截图:
**文件路径:**C:\..\YourApplication\
-
现在打开 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
-
接下来,构建解决方案并将其部署到本地开发集群。服务启动后,如 Service Fabric Explorer 中所示,您可以看到 MySetup.bat 文件以两种方式成功。打开 PowerShell 命令提示符并键入:
PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
MyValue
-
然后,记下在 Service Fabric Explorer 中部署和启动服务的节点的名称,例如节点 2。接下来,导航到应用程序实例工作文件夹以找到显示值的 out.txt 文件的测试变量。例如,如果此服务部署到节点 2,那么您可以转到 MyApplicationType 的此路径:
C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt