打包 SF 无状态 ASP.NET Core Web 应用程序后缺少代码

Posted

技术标签:

【中文标题】打包 SF 无状态 ASP.NET Core Web 应用程序后缺少代码【英文标题】:Code missing after packaging SF stateless ASP.NET Core web application 【发布时间】:2018-01-19 15:01:18 【问题描述】:

我创建了一个带有普通无状态服务和无状态 ASP.NET Core Web 应用程序的 Service Fabric 应用程序。在不更改任何默认代码的情况下,我尝试部署应用程序。部署过程中发生错误:

Register-ServiceFabricApplicationType : 中应用程序的BuildLayout C:\SfDevCluster\Data\ImageBuilderProxy\AppType\AadMockApplicationType 无效。缺少服务代码 TenantWebServerPkg。

检查我的包后,我注意到包中没有代码,只有服务清单文件和配置包:

我的网络应用服务清单:

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="TenantWebServerPkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <!-- This is the name of your ServiceType. 
         This name must match the string used in RegisterServiceType call in Program.cs. -->
    <StatelessServiceType ServiceTypeName="TenantWebServerType" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>TenantWebServer.exe</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <!-- Config package is the contents of the Config directoy under PackageRoot that contains an 
       independently-updateable and versioned set of custom configuration settings for your service. -->
  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to 
           listen. Please note that if your service is partitioned, this port is shared with 
           replicas of different partitions that are placed in your code. -->
      <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="8396" />
    </Endpoints>
  </Resources>
</ServiceManifest>

尝试了几个小时后,我注意到代码包被发布到不同的文件夹:C:\Users\username\AppData\Local\Temp\PublishTemp\TenantWebServer118

如何正确打包 Web 应用程序以便包含代码包?

【问题讨论】:

您的服务清单中有什么? @Mardoxx 我添加了我的服务清单。 我也注意到代码包确实存在,但是发布到了AppData\Temp\PublishTemp文件夹中。 我尝试创建相同的项目,VS2017 构建了包含Code 文件夹的有效包。让我们尝试找出我们的环境之间的区别。你用的是VS2015还是VS2017?如果是VS2015,有机会在VS2017下查看吗? 如何构建包?通过项目上下文菜单中的Package?让我感到困惑的一件事是,在您的目录列表中 Stateless1PkgTenantWebServerPkg 被放在一个 PKG\DEBUG 目录下。在我的情况下,它们被放置在项目中的单独目录下,例如Stateless1Pkg\pkg\Debug\Stateless1PkgTenantWebServerPkg\pkg\Debug\TenantWebServerPkg。您知道为什么它们在您的情况下位于同一 pkg\Debug 目录下吗?您是否可以进行一些特定的定制来实现这一目标? 【参考方案1】:

注意: Visual Studio 2015 的 .NET Core 工具不再更新,但如果您仍在使用 Visual Studio 2015,则需要安装 .NET Core VS 2015 Tooling Preview 2。

如Microsoft docs中所述:

要开发 ASP.NET Core Service Fabric 应用程序,您应该安装以下工作负载:

Azure 开发(在Web & Cloud 下) ASP.NET 和网络开发(在网络和云下) .NET Core 跨平台开发(在其他工具集下)

更新:

问题:为什么将代码包发布到不同的文件夹?

答案: Example (Powershell) 注册一个应用类型

PS C:\> Copy-ServiceFabricApplicationPackage -ApplicationPackagePath "c:\work\PersistentToDoListService" -ImageStoreConnectionString "file:C:\SfDevCluster\Data\ImageStoreShare" -ApplicationPackagePathInImageStore "PersistentToDoListService"
PS C:\> Register-ServiceFabricApplicationType -ApplicationPathInImageStore "PersistentToDoListService"

Copy-ServiceFabricApplicationPackage 将 "c:\work\PersistentToDoListService" 文件夹中的应用程序包复制到映像存储。将包复制到图像存储中的相对路径“PersistentToDoListService”

Register-ServiceFabricApplicationType 命令注册在 relative 路径 "PersistentToDoListService" 中找到的应用程序类型。

【讨论】:

以上是关于打包 SF 无状态 ASP.NET Core Web 应用程序后缺少代码的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 2.1 API JWT 无 cookie 会话?

小白开学Asp.Net Core 《十》

Asp.Net Core中下载图片打包zip

Docker打包 Asp.Net Core应用,在CentOS上运行

Asp.Net Core 服务生命周期

ASP.NET Core WebSockets