在同一主机和端口下运行多个应用

时间:2019-03-28 11:21:12

标签: c# visual-studio iis asp.net-core iis-express

我正在一个解决方案中开发多个asp.net核心应用程序,当我使用IIS Express在Visual Studio中运行该解决方案时,希望它们具有相同的URL和端口。例如:

我尝试将lauchSettings.json文件更改为使用相同的主机和url,但出现错误,表明服务器无法运行。

是否可以配置它?

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:44369/App2",
      "sslPort": 44369
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "App2": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    }
  }
}

2 个答案:

答案 0 :(得分:1)

这是不可能的,并且是一个完美的例子,说明为什么任何Web开发人员都应该熟悉他们打算开发的实际平台,即:HTTP和TCP / IP协议,坦率地说套接字在其中的工作方式一般情况下。

计算机之间的通信通过各种协议在端口上进行。这种通信是通过数据包进行的,类似于邮件中发送的信件。与封包一样,封包也会被寻址,这使接收方计算机可以将其路由到正确的目的地。当到达最终目标计算机时,该计算机还必须将其路由到其定向到的应用程序或设备。这部分类似于传递给企业的邮件。所有邮件都传递到组织的某个中央部分,然后再路由到目的地的特定员工。

对于类似Web应用程序的情况,上述情况中的“雇员”由URL和/或端口标识。从技术上讲,它始终是URL 端口,但是任何一个都可以是“默认”端口。因此,仅一个端口假定0.0.0.0或分配给该机器的所有IP地址的集合,而一个URL假定默认的协议端口(HTTP为80,HTTPS为443)。无论如何,该组合必须有一个唯一的收件人。再次,回到办公室的比喻,想象一下两个员工在哪里共享和办公室以及一封邮件正好打到办公室的房间号码。您怎么知道实际上要去的两个雇员?你不能。实际上,这更像是两个姓和名相同的员工共享一个办公室。即使您有雇员的姓名,您仍然会知道将其发送给哪个人。

简而言之,您想要的东西是不可能的,并且显然如果您真正了解要开发的平台是不可能的,坦白地说,这是任何类型的开发的前提。每个应用程序必须使用唯一的URL和/或唯一的端口。没有别的选择。

答案 1 :(得分:0)

我正在逐渐将一个大型ASPX应用程序从.Net Framework 4.8迁移到.Net5。今天,我遇到了类似的问题。通过IIS Express一起运行两个.Net Framework应用程序“可以正常运行”,但对于.Net Core / 5而言,运行起来不一定那么容易。我希望将网站的旧版部分托管在现有的Web项目和网站,我希望将网站的.Net 5部分托管在根目录下的虚拟目录中。我的两个站点需要一起工作,因为两个应用程序之间共享了基于声明的身份验证,但是我很难过一会儿就使Visual Studio IIS Express集成在两个项目之间正常且一致地工作。对我来说,使其正常工作的方法如下:

  1. 更新这两个配置,以使这些应用程序可以在相同的主机和端口上但在不同的目录中运行。一个目录可以是另一个目录的父目录,也可以是并行目录。两个应用程序必须在同一解决方案中(这就是我们在这里关注的全部原因,对吧?)。这可能需要更改launchSettings.json和/或.csproj文件,具体取决于您所使用的.Net版本,因为在创建项目时,Visual Studio会随机分配端口,并且无法更改通过用户界面。为了确保主机和端口在更改后正确无误,您可以通过查看解决方案资源管理器中项目的“属性”元素来检查设置,具体取决于.Net版本。在Web或“调试”选项卡中。

  2. 请确保该解决方案的任何.Net 5 / Core Web应用程序的根目录中都有一个web.config文件。这是确保设置不会发生的关键。在applicationHost.config中获取坚果,这是我缺少的部分。默认的Visual Studio行为和默认的.Net 5 Web应用程序模板将在applicationHost.config中导致如下所示,这是在同时运行多个应用程序时出现的问题:

产生问题的applicationHost.config片段:

<aspNetCore processPath="%LAUNCHER_PATH%" stdoutLogEnabled="false" hostingModel="InProcess" startupTimeLimit="3600" requestTimeout="23:00:00" />

这里的问题是%LAUNCHER_PATH%不一致,具体取决于您启动的应用程序。为了避免将类似的配置添加到applicationHost.config中,您可以将web.config添加到每个.Net Core / 5应用的根目录,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <remove name="aspNetCore"/>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="bin\Debug\net5.0\YourExeNameHere.exe" arguments="" stdoutLogEnabled="false" hostingModel="InProcess">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="44300" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

您的配置可能会有所不同。此处的关键只是用本地Web.config中exe的路径替换%LAUNCHER_PATH%,无论应用程序如何启动或如何相互关联,IIS Express都将使用该路径。您可能需要使用OutOfProcess HostingModel,和/或可能需要指定其他一些参数,例如HTTPS端口。您可能需要调整applicationHost.config以清除之前可能遗留的任何混乱。删除并让VS重新创建applicationHost.config甚至可能会有所帮助。

如果继续出现错误,请尝试通过系统托盘停止IIS Express并重新启动它。尽管可以在IIS Express中同时使用所有应用程序,但是从另一应用程序的角度来看,IIS Express忙于提供解决方案时,您仍然无法为其中一个应用程序“在浏览器中查看”。不幸的是,这还具有在提供应用程序时锁定输出.exe的副作用,因此可能经常需要终止IIS Express才能修复生成错误。根据您的特定情况,您可能还需要更改一些其他applicationHost.config设置,以允许覆盖本地web.config文件中的设置。例如OverrideModeDefault =“ Allow”和/或lockItem =“ false”。