运行 node.js 和 WebAPI 在同一服务器上用于具有 IIS 的同一站点
Run node.js & WebAPI on same server for same site with IIS
我希望慢慢将 Node.js
应用程序转换为 ASP.NET WebAPI 2.0
。我目前正在使用 IIS
,并将坚持使用 IIS
。所以,我想将它们托管在同一台服务器上,但将一些 URI 定向到新平台。
我如何在 web.config
中执行此操作?当前 node.js
的 web.config
看起来像这样:
<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
- ...
我在想我应该写一个新规则来列出要转到 WebAPI
的 URI。但是,我不太确定该怎么做。我的猜测是我会为每个 URI
添加一个条件 input
属性。我也在想我应该指向 ASP.NET WebAPI
项目,但我更不知道我应该怎么做,因为 Node.js
我只是指向 app.js
文件。
好的,这就是我最后做的。这实际上非常简单。但是当您不熟悉 IIS 时,它可能会令人望而生畏。
我把原来的web.config
放在了node
目录下。如果您不这样做,我认为 iisnode
处理程序会干扰 WebAPI
配置。因此,node
目录中的新 node.js
web.config
将如下所示:
<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>
对于 root web.config
我直接指向静态文件,绕过 node.js
。这意味着我将不得不编写一些自定义代码来处理 gzipped
文件的重写 - 我稍后会解决这个问题。我还为每个 rewrite
rule
添加了属性 stopProcessing
。这也搞乱了代码,因为它实际上不会在我想要的地方重写,因为重写会被覆盖。请注意,accept
版本控制 header 尚未实际测试过 - 我没有任何理由相信它不会起作用。默认情况下,最后一个 rewrite
将所有 uri
指向 webapi
应用程序。
在 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>
我希望慢慢将 Node.js
应用程序转换为 ASP.NET WebAPI 2.0
。我目前正在使用 IIS
,并将坚持使用 IIS
。所以,我想将它们托管在同一台服务器上,但将一些 URI 定向到新平台。
我如何在 web.config
中执行此操作?当前 node.js
的 web.config
看起来像这样:
<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
- ...
我在想我应该写一个新规则来列出要转到 WebAPI
的 URI。但是,我不太确定该怎么做。我的猜测是我会为每个 URI
添加一个条件 input
属性。我也在想我应该指向 ASP.NET WebAPI
项目,但我更不知道我应该怎么做,因为 Node.js
我只是指向 app.js
文件。
好的,这就是我最后做的。这实际上非常简单。但是当您不熟悉 IIS 时,它可能会令人望而生畏。
我把原来的web.config
放在了node
目录下。如果您不这样做,我认为 iisnode
处理程序会干扰 WebAPI
配置。因此,node
目录中的新 node.js
web.config
将如下所示:
<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>
对于 root web.config
我直接指向静态文件,绕过 node.js
。这意味着我将不得不编写一些自定义代码来处理 gzipped
文件的重写 - 我稍后会解决这个问题。我还为每个 rewrite
rule
添加了属性 stopProcessing
。这也搞乱了代码,因为它实际上不会在我想要的地方重写,因为重写会被覆盖。请注意,accept
版本控制 header 尚未实际测试过 - 我没有任何理由相信它不会起作用。默认情况下,最后一个 rewrite
将所有 uri
指向 webapi
应用程序。
在 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>