使用 IIS 在同一服务器上为同一站点运行 node.js 和 Web API

2023-12-29

我正在寻找慢慢转换Node.js应用程序转移到ASP.NET WebAPI 2.0。我目前正在使用IIS并会坚持IIS。因此,我想将它们托管在同一台服务器上,但将一些 URI 定向到新平台。

我将如何在web.config?目前的web.config for node.js看起来像这样:

<configuration>
  <system.webServer>

    <handlers>
      <!-- indicates that the app.js file is a node.js application
           to be handled by the iisnode module -->
      <add name="iisnode" path="beta/app.js" verb="*" modules="iisnode" />
    </handlers>

    <rewrite>
      <rules>
        <!-- Don't interfere with requests for node-inspector debugging -->
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^beta/app.js\/debug[\/]?" />
        </rule>

        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->

        <rule name="StaticContent">
          <action type="Rewrite" url="beta/public{REQUEST_URI}" />
        </rule>

        <!-- All other URLs are mapped to the Node.js application entry point -->
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
          </conditions>
          <action type="Rewrite" url="beta/app.js" />
        </rule>

      </rules>
    </rewrite>
    <httpErrors errorMode="Detailed"/>
  </system.webServer>
</configuration>

文件结构为:

- web.config (the one shown above)
  -> node
      - app.js
      - ...
  -> webapi
      - web.config
      - global.asax
      - ...

我在想我应该编写一条新规则,列出要访问的 URIWebAPI。但是,我不太确定该怎么做。我的猜测是我会为每个添加一个条件URIinput属性。我也在想我应该指出ASP.NET WebAPI项目,但我更不知道应该如何去做,因为Node.js我只是指着app.js file.


好吧,这就是我最终所做的。它实际上非常简单。但是,当您不熟悉 IIS 时,这可能会令人望而生畏。

我把原来的web.confignode目录。我觉得iisnode处理程序干扰WebAPI配置,如果你不这样做。所以,新的node.js web.config in the node目录看起来像这样:

<configuration>
  <system.webServer>

    <handlers>
      <!-- indicates that the app.js file is a node.js application
           to be handled by the iisnode module -->
      <add name="iisnode" path="app.js" verb="*" modules="iisnode" />
    </handlers>

    <rewrite>
      <rules>

        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
            <match url="^app.js\/debug[\/]?" />
        </rule>

      </rules>
    </rewrite>
    <httpErrors errorMode="Detailed"/>

  </system.webServer>
</configuration>

对于根web.config我让它直接指向静态文件,绕过node.js。这意味着我将不得不编写一些自定义代码来处理重写gzipped文件 - 我稍后会解决这个问题。我还添加了属性stopProcessing每一个rewrite rule。这也弄乱了代码,因为它实际上也不会重写我想要的地方,因为重写会被覆盖。请注意,accept版本控制标头实际上尚未经过测试 - 但我没有任何理由相信它不起作用。最后rewrite全部点uriwebapi默认情况下应用程序。

In the WebAPI我必须将所有路线路由到的项目webapi/api因为它不在根文件夹中。在我将所有内容迁移后node.js我可能会做webapi目录项目的根文件夹,因此不需要webapi在我的路由中了。但这对客户来说都是隐藏的。

所以这是实际的代码:

<configuration>
  <system.webServer>

    <rewrite>
      <rules>

        <!-- test item for webapi folder -->
        <rule name="StaticContent2" stopProcessing="true" >
            <conditions>
                <add input="{REQUEST_URI}" pattern="^/def" />
            </conditions>
            <action type="Rewrite" url="webapi{REQUEST_URI}" />
        </rule>

        <!-- rewrite static items which exist on node -->
        <rule name="Node Static" stopProcessing="true" >
            <conditions>
                <add input="{REQUEST_URI}" pattern=".*\.[A-Za-z2]{2,5}$" />
            </conditions>
            <action type="Rewrite" url="node/public{REQUEST_URI}" />
        </rule>

        <rule name="WebAPI Version 2" stopProcessing="true">
            <conditions>
                <add
                    input="{HEADER_ACCEPT}"
                    pattern="vnd.fieldops.v2"
                    ignoreCase="true"
                />
            </conditions>
            <action type="Rewrite" url="webapi{REQUEST_URI}" />
        </rule>

        <!-- rewrite to node for dynamic items -->
        <rule name="Node Dynamic" stopProcessing="true" >
            <conditions>
                <add
                    input="{REQUEST_URI}"
                    pattern="^/api/(dealerservicereports|chat|dealers|dealerequipment|dealercloseout|publications|tokens|users|\?)"
                    ignoreCase="true"
                />
            </conditions>
            <action type="Rewrite" url="node/app.js" />
        </rule>

        <!-- rewrite everything else to webapi -->
        <rule name="WebAPI Dynamic" stopProcessing="true" >
            <action type="Rewrite" url="webapi{REQUEST_URI}" />
        </rule>

      </rules>
    </rewrite>
    <httpErrors errorMode="Detailed"/>

  </system.webServer>
</configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IIS 在同一服务器上为同一站点运行 node.js 和 Web API 的相关文章

随机推荐

  • 捕获位于不同类中的 SwingWorker 抛出的异常

    我有一个主课Gui处理我的 GUI 并调用一些已放入其自己的类中的 SwingWorkers 调用数据库和其他数据源 TablesDataManager 我的问题是 当其中一个 swingworkers 在其 did90 方法中 即在 ED
  • 如何在Python多处理上识别进程的CPU核心ID?

    我正在测试Python的multiprocessing使用 SLURM 集群上的模块 我想绝对确保我的每个任务实际上都按照我的意图在单独的 cpu 核心上运行 由于配置 SLURM 的可能性有很多 因此这一点并不明显 因此 我想知道是否有一
  • 为单个 Action Spark 应用程序缓存数据帧(在该应用程序中多次引用该数据帧)是否有效?

    我对 Spark 的缓存机制有点困惑 假设我有一个 Spark 应用程序 在多次转换结束时只有一个操作 假设我有一个数据帧 A 并对其应用了 2 3 次转换 创建了多个数据帧 这最终有助于创建将保存到磁盘的最后一个数据帧 例子 val A
  • 条件文本格式 XAML WP8

    是否可以在 XAML 中设置某种形式的文本块控件的条件格式 以便可以根据文本更改文本的颜色 例如 Text good 然后设置为绿色 Text bad 然后设置文本为红色 我尝试了一些例子 但它们似乎不起作用 大概是因为 WP8 的工作方式
  • 查看导航抽屉预览

    我正在 Android Studio 中设计一个本机导航抽屉 我在预览中看不到抽屉 因为它位于活动的左侧 超出了预览范围 现在我使用 testlayout xml 文件来查看我的更改 但很多时候我忘记将它们复制粘贴到正确的活动中 有没有办法
  • 为什么我的程序要求 OpencV 的 .dll,即使我静态链接到它的 .lib

    我正在构建一个使用 OpenCV 3 1 与 CMake 3 5 和 Visual Studio 2015 x64 的小程序 我链接到 OpenCV 的 lib 文件 但是当我尝试运行该程序时 出现有关缺少 DLL 的错误 这是我的CMak
  • Pycharm 中的 Jupyter 笔记本在 Pycharm 中没有本地历史记录支持?

    Local History是一个绝对基本 关键的特征JetbrainsIDE 系列 包括Pycharm 为什么会缺少 ipynb文件 这是右键单击 上下文菜单 其中Show History不见了 除此之外Code Editing Histo
  • 如何在java中使用jmap分析堆转储

    我正在使用以下命令创建堆转储 jmap dump file DumpFile txt
  • 在 Rails 中播种数据库的最佳方法是什么?

    我有一个 rake 任务 可以在我的 Rails 应用程序中填充一些初始数据 例如 国家 州 移动运营商等 我现在设置的方式是 我在 db fixtures 的文件中有一堆 create 语句 以及一个处理它们的 rake 任务 例如 我的
  • 有什么区别

    有什么区别 a and a 一个使用括号 另一个不使用 但是使用其中一个有什么区别 什么是 正确 的选项 如果我不使用任何会发生什么href属性 据我所知 在javascript中 使用something someFunc 将该函数的返回值
  • VS2015安装一直挂起

    我尝试在完全更新的 Windows 8 1 上安装 vs2015 CTP5 但安装在 LocalESPCui for en us Dev12 步骤上一直挂起 大约一个小时 我正在使用通过PowerISO安装的 iso 如何才能完成安装 安装
  • 设置Surface View的背景颜色

    我想为相机表面视图的表面视图设置背景颜色 我在用this https stackoverflow com questions 8104789 how to set backgroundcolor to a surfaceview in an
  • 从 MySQL 表中删除制表符、换行符等

    我需要从 MySQL 表的字段中删除多个空格 制表符 换行符 回车符 换页符或垂直制表符 Here 如何使用Java删除字符串中的重复空格 http tab 20new 20line 20carriage 20return 20form 2
  • ZendFramework - 如何从控制器添加 ->HeadScript()?

    我有一个情况 我需要将控制器中的 Javascript 添加到已经有 HeadScript 的布局中 如何从控制器做到这一点 e g this gt view gt HeadScript gt appendScript 这是控制器 两者都不
  • Grails 与 Spring [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 任何人都可以解释一下 对于超过 500 个数据库表的企业 Java Web 应用程序来说 什么是更好的选择 我们应该使用 Grails 或 Go
  • 尝试使用 BigQuery 计算 EMA(指数移动平均线)

    我正在尝试计算股票价格的指数移动平均线 EMA 我正在使用一个公式从该网站计算 EMA http www iexplain org ema how to calculate http www iexplain org ema how to
  • 如何检测何时按下热键(快捷键)

    How do I detect when a shortcut key such as Ctrl O is pressed in a WPF independently of any particular control I tried c
  • Google 附近的消息 - 取消设备之间的初始链接

    我正在构建一个应用程序来测试 Google 附近消息 API 对于该测试 我使用 DISTANCE TYPE EARSHOT 根据这个线程附近 API 的 Strategy DISTANCE TYPE EARSHOT 似乎并不限制消息接近度
  • 网络聊天或 Skype 上不显示 Rich Card 附件

    Rich Card 附件未在网络聊天或 Skype 上显示 但在模拟器上显示正常 如果我使用 ContentType ContentURL 附件包含正确的数据和属性并且工作正常 但如果我使用丰富的卡片附件 它们不会显示在网络聊天或 Skyp
  • 使用 IIS 在同一服务器上为同一站点运行 node.js 和 Web API

    我正在寻找慢慢转换Node js应用程序转移到ASP NET WebAPI 2 0 我目前正在使用IIS并会坚持IIS 因此 我想将它们托管在同一台服务器上 但将一些 URI 定向到新平台 我将如何在web config 目前的web co