如何在iisexpress vs2015中设置具有相同端口和域但路径不同的多个应用程序

Joa*_*los 5 iis-express visual-studio-2015 asp.net-core

我目前正在将一个大的 asp.net 核心解决方案拆分为多个较小的解决方案,每个解决方案都有一个应用程序。为此,基础应用程序需要指向

www.originalApp.com

并且我的每个较小的应用程序都将使用路径访问

www.originalApp.com/SplittedApp

我已经设法使用 IIS 在 applicationHost.config 中通过以下设置运行它

        <site name="OriginalApp" id="3" serverAutoStart="true">
            <application path="/" applicationPool="OriginalAppPool">
                <virtualDirectory path="/" physicalPath="OriginalAppPath/>
            </application>
            <application path="/SplittedApp" applicationPool="splittedApp">
                <virtualDirectory path="/" physicalPath="splittedAppPath />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:82:" />
                <binding protocol="http" bindingInformation="IpAddress:originalApp" />
            </bindings>
            <applicationDefaults applicationPool="Fire.Frontend" />
        </site>
Run Code Online (Sandbox Code Playgroud)

我已经在 IISExpress 的 applicationHost.config 文件中为这两个应用程序尝试了此设置的多种变体,但出现了不同的问题。

拆分应用程序中的我的应用程序 launchSettings.json 如下所示

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:9345/splitted app",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

和原来的应用程序

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:9345",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

当前设置无法加载第二个应用程序,因为正在使用相同的端口,但是我需要使用相同的端口,以便我可以附加路径并有效地导航两个应用程序之间的页面。

我发现很难相信我试图实现的目标是不可能使用 IIS Express 实现的,因为它与 IIS 一起工作得很好。

我已经在网络上阅读了很多关于 SO 和博客的帖子,但我找不到任何有同样问题的人,而且似乎没有类似问题的解决方案对我有用,所以如果有人能指出我正确的方向,那将是最赞赏。

谢谢。

PS 我不确定我在问题中添加的标签是否正确,所以让我知道是否有更好的标签要添加。

sha*_*non 2

在我们的构建过程中,我们选择继续“打包/发布”到安装了 .NET Core 处理程序的 IIS 服务器。因此,我们的选择有些限制,因为必须有某种方法在 Web 发布工具支持的开发和生产部署之间提供对称性。

以下是一些可能的解决方案:

  1. 将子内容部署为父应用程序的子应用程序
  2. 在父部署期间将子内容部署为附加静态文件夹内容
  3. 将子内容部署为父内容的构建依赖项
  4. 使用虚拟目录手动部署子内容

选择哪个?这是一个决策树:

  • 子路径是要部署的应用程序/程序集(例如WebAPI)吗?如果是这样,请选择选项 1。
  • 子路径是松散耦合的包,单独版本控制还是由另一个团队构建?如果是这样,请选择选项 3。
  • 在备份/恢复、部署和安全操作期间,路径是否最好在服务器的单个单元中维护?如果是这样,请选择选项 4。
  • 否则,选择选项 2。

让我们快速浏览一下其中的每一个:

1. 将子内容部署为父应用程序的子应用程序

这在 IIS 部署目标(例如公共 Web 服务器)上非常简单。使用相同的旧工具或手动在发布目标服务器上创建子应用程序。然而,这在开发工作站上更加困难。在下图中,顶部显示了 .NET Core 应用程序的配置方式,底部显示了 .NET Framework 应用程序在 Visual Studio UI 中的呈现方式: 在此输入图像描述

在这两种情况下,它都会在.vs\config\applicationhost.config文件中创建这些内容;但新的 ASP.NET Core 工具仅在该工作站.config文件中创建根应用程序(而不是子应用程序)。我们可以为每个开发人员手动编辑此文件,但不幸的是我们通常不想签入这些文件,因为它们具有本地计算机路径。无论如何,如果您尝试使用旧的多项目启动属性方法,您最终会遇到多个站点尝试在同一端口运行失败的情况。相反,您想要的是一个站点具有多个应用程序。这是此类(手动编辑的)工作配置的示例:

<site name="MyNamespace.RootWeb" id="5">
  <application path="/" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="E:\Development\MySolution\MyProject" />
  </application>
  <application path="/assets" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="E:\Development\MySolution\MyProject.Assets" />
  </application>
  <bindings>
              <binding protocol="http" bindingInformation="*:55519:localhost" />
  </bindings>
</site>
Run Code Online (Sandbox Code Playgroud)

另一种方法可能是创建一个.target文件来添加 Visual Studio 在 ASP.NET Core 项目中失去的功能,方法是扫描项目文件,并在其中任何一个比片段新时launchsettings.json将所有项目 URL 前缀合并到单个中间 XML片段文件中<sites />,并将片段合并到applicationhost.config(甚至通过中间文件执行更改冲突)。如果我这样做,我会让你知道的。

最后,您可以更改项目 Web 启动应用程序。不是“项目”,因为 Kestrel 也无法在同一端口上托管多个应用程序。但是,WebListener 可以接受完成此操作所需的所有命令行参数。

2. 在父部署期间将子内容部署为附加静态文件夹内容。

如果我们实际上没有正在构建的相关程序集,我们可以在单个应用程序中运行。在开发工作站上,我们可以使用 .有条件地重定向子内容的路径if (env.IsDevelopment()) IApplicationBuilder.UseStaticFiles();。我们仍然需要让内容在服务器上运行。为此,我们将使用IncludePluginFilesForMsdeploy部署指令,类似于:

<PropertyGroup>
  <PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>
    IncludePluginFilesForMsdeploy;
    $(PipelineCopyAllFilesToOneFolderForMsdeployDependsOn);
  </PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>
</PropertyGroup>
<Target Name="IncludePluginFilesForMsdeploy">
  <ItemGroup>
    <FileWrites Include="$(MSBuildProjectDirectory)\bin\**\*" />
    <_CustomFiles Include="$(MSBuildProjectDirectory)\bin\**\*" />
    <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>bin\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

不过,请注意,以前IncludePluginFilesForMsdeployIncludePluginFilesForPackaging,现在在 VS 2017 中使用 实现相同的目标DotnetPublishFiles,如下所示:

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="CustomCollectFiles" BeforeTargets="BeforePublish">
        <Message Text="Custom Collect Before Publish" Importance="high" />
        <ItemGroup>
            <_CustomFiles Include="$(MSBuildProjectDirectory)/../MyProject/compiled/**/*" />
            <DotnetPublishFiles Include="@(_CustomFiles)">
                <DestinationRelativePath>wwwroot/MyProject/compiled/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
            </DotnetPublishFiles>
        </ItemGroup>
    </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

3. 将子内容部署为父内容的构建依赖项。

同样,对于静态内容(例如浏览器应用程序),我们可能会考虑将该应用程序构建到包中,并使用 NuGet、NPM 或类似工具将其添加到开发中的根应用程序中。事实上,现在需要部署一个应用程序,这一点既有利也有弊。我会将其留给由单独团队维护的非常松散耦合的包,或者必须为依赖项单独维护版本控制的情况。

4. 使用虚拟目录手动部署子内容。

在服务器上,如果我们不需要子应用程序,我们可能仍然希望为此子内容拥有一个外部文件夹层次结构。我们可以使用虚拟目录在父目录下反映此内容并包含部署标志<DeployAsIisApp>False</DeployAsIisApp>。或者,我们可以使用 NPM、FTP 或其他一些技术直接部署到服务器。在开发站上,我们可以做UseStaticFiles()与上面相同的想法。或者,我们可以再次破解.vs\config\applicationhost.config(与团队合作时的缺点与上面相同),但创建一个额外的虚拟目录而不是额外的应用程序。


归档时间:

查看次数:

2836 次

最近记录:

8 年,3 月 前