【问题标题】:Hooking up sub applications in ASP.NET Core在 ASP.NET Core 中连接子应用程序
【发布时间】:2018-07-17 02:38:32
【问题描述】:

我在 asp.net core 2.1 中有两个项目。一个是主 Web 应用程序,另一个是子应用程序。子应用程序大部分是独立的;它只需要来自主应用程序的 cookie。

我正在尝试在我的本地开发环境中设置这两个项目但失败了,而且我还需要为将来的实时 IIS 部署进行设置。我在同一个 VS 解决方案中有两个 VS 项目。在他们的项目调试设置页面中,我将它们都设置为启动 IISExpress,应用 URL 为“http://localhost:44305”。我也尝试将子应用设置为“http://localhost:44305/subapp”,但是当 vs 运行时,IISExpress 抱怨该端口已在使用中。

我有两个应用程序的网络配置。两者的非常基本的默认值。在子应用程序中,我有额外的行来删除 aspnetcore 处理程序(正如我在搜索中发现的那样)。

<remove name="aspNetCore" />

在子应用中,我也尝试过在startup.cs中添加:

app.UsePathBase("/subapp")

我从在本地运行的这个设置中得到的结果是,在基本 URL 上,它实际上加载了我的子应用程序而不是我的主应用程序(浏览器 URL 是 localhost:44305)。摆弄多种设置似乎无济于事。两个应用程序都无法完全加载,或者一个或另一个应用程序无法访问。

是否有任何适当的文档可用于设置多个应用程序以在本地和 IIS 中协同工作?我似乎找到的所有东西都来自 2.0 之前的版本。

感谢您的帮助!

编辑: 在部署到 IIS 时,我实际上设法让一个新项目作为子应用程序工作。设置:

  1. 使用两个 aspnetcore 2.1 Web 应用程序制作新的 VS 解决方案。

  2. 将 web.config 添加到子应用程序中:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
        <handlers>
        </handlers>
        <aspNetCore processPath="dotnet" arguments=".\IISTestSubApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
      </system.webServer>
    </configuration>
    
  3. 主应用没有网络配置。

  4. 将 .UseIISIntegration() 添加到 Program.cs CreateWebHostBuilder 到两个应用程序。

  5. 在 Startup.cs 中为 Subapp 配置方法,添加app.UsePathBase("/subapp/");

  6. 将主应用程序部署到文件夹 /Mainapp。将子应用部署到 /Mainapp/subapp。

  7. 为主应用设置 iis 网站。

  8. 在 IIS 中右键单击主应用程序网站,然后单击添加应用程序。添加具有别名“/Subapp”的子应用程序

这应该就是你所需要的。有些步骤可能不是必需的。我还没有完全测试过哪些步骤是 100% 必要的。

不幸的是,我仍然无法让它与 IISExpress 一起工作。我的 .vs/applicationhost.config 文件看起来几乎与 IIS 文件一模一样,但是当同时运行这两个应用程序时,我收到错误消息,指出端口已在使用中。我还在尝试一堆新东西,所以,我们看看能不能搞定。

【问题讨论】:

  • 这可能会让我更接近一点。你还有什么可以提供的信息吗?喜欢正确的网络配置?我应该使用 PathBase 吗?
  • 通过您的更改,我的主应用程序正在加载,但子应用程序收到 HTTP 错误 403.14 - 禁止
  • 我已经撤回了我的提交,因为我发现使用属性路由时似乎存在路由问题。我不确定还有什么建议我害怕。抱歉,我不能提供更多帮助。
  • @john 是的,我似乎几乎可以让它工作,但是当我运行应用程序时,它会自动将应用程序池切换到其他东西。
  • 我认为可能的问题出在主应用程序的 webconfig 中,其中添加了 aspnet 处理程序。它设置为具有 path=' * ' 和 verb=' * '。是否可以忽略路径'/subapp/'?我尝试为我的主应用程序添加特定路径,而不是 *,但它似乎不起作用。我不知道这个设置的参数是如何格式化的。

标签: c# iis asp.net-core


【解决方案1】:

我现在可以在 IISExpress 中使用它。首先按照上面的 IIS 步骤进行基本设置,包括以下内容:

  1. 对于 IISExpress,子应用 web.config 文件应如下所示:

    <configuration>
        <system.webServer>
            <handlers>
            </handlers>
        <aspNetCore processPath="dotnet" arguments=".\bin\Debug\netcoreapp2.1\IISTestSubApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
        </system.webServer>
    </configuration>
    
  2. 在您的解决方案的 .vs/config/applicationhost.config 文件中,确保您的站点部分看起来像

    <site name="IISTest" id="2" serverAutoStart="true">
    <application path="/" applicationPool="IISTest AppPool">
      <virtualDirectory path="/" physicalPath="C:\Users\user\Documents\GitHub\IISTest\IISTest" />
    </application>
    <application path="/subapp" applicationPool="IISTest AppPool">
      <virtualDirectory path="/" physicalPath="C:\Users\user\Documents\GitHub\IISTest\IISTestSubApp" />
    </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:44301:localhost" />
    </bindings>
    </site>
    

这两个应用程序使用不同的应用程序池似乎没问题。出于某种原因,当 vs 运行时,将它们设置为相同会被覆盖。

  1. 仅从 vs 运行主应用程序;也不要尝试运行子应用程序。您将收到端口已占用错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多