IIS节点应用程序无法使用Web.Config正确运行?

时间:2017-07-10 15:33:49

标签: node.js iis web-applications web-config iisnode

我有一个节点应用程序我想使用IIS运行。问题是我的配置文件。我使用IIS 10.0,不知道如何正确配置一切?每当我在Web.Config文件中包含这两个规则时......

<!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
<rule name="StaticContent" patternSyntax="Wildcard">
    <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
        <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        </conditions>
        <match url="*.*"/>
</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="server.js"/>
 </rule>

...我收到500.1000错误,如下所示:

500.1000 ERROR

当我拿出一个或另一个时,我的网站页面和链接加载正确,但所有POST请求都会产生404错误?因为它在我的server.js文件中搜索物理路径而不是调用POST函数?

这是404 ERROR:

404 ERROR

我知道我的网站有效,因为它在VS 2015的调试器中有效(GET和POST请求)。以下是我的代码和配置文件中的代码段。

这是完整的Web.Config文件:

<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <appSettings>
        <!--
            All appSettings are made available to your Node.js app via environment variables
            You can access them in your app through the process.env object.

            process.env.<key>
        -->

       <!-- Unconmment the below appSetting if you'd like to use a Virtual Directory -->
       <!-- <add key="virtualDirPath" value="" /> -->
    </appSettings>
    <system.webServer>
        <iisnode node_env="%node_env%"
                 nodeProcessCountPerApplication="1"
                 maxConcurrentRequestsPerProcess="1024"
                 maxNamedPipeConnectionRetry="100"
                 namedPipeConnectionRetryDelay="250"
                 maxNamedPipeConnectionPoolSize="512"
                 maxNamedPipePooledConnectionAge="30000"
                 asyncCompletionThreadCount="0"
                 initialRequestBufferSize="4096"
                 maxRequestBufferSize="65536"
                 uncFileChangesPollingInterval="5000"
                 gracefulShutdownTimeout="60000"
                 loggingEnabled="true"
                 logDirectory="iisnode"
                 debuggingEnabled="true"
                 debugHeaderEnabled="false"
                 debuggerPortRange="5058-6058"
                 debuggerPathSegment="debug"
                 maxLogFileSizeInKB="128"
                 maxTotalLogFileSizeInKB="1024"
                 maxLogFiles="20"
                 devErrorsEnabled="true"
                 flushResponse="false"
                 enableXFF="false"
                 promoteServerVars=""
                 configOverrides="iisnode.yml"
                 watchedFiles="web.config;*.js"
                 nodeProcessCommandLine="C:\Program Files\nodejs\node.exe"/>

        <!-- 
            Before the handlers element can work on IIS 8.5
            follow steps listed here https://github.com/tjanczuk/iisnode/issues/52 
        -->                 
        <handlers>
            <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>

            <!-- Uncomment below handler if using Socket.io -->
            <!--<add name="iisnode-socketio" path="server.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="^server.js\/debug[\/]?"/>
                </rule>

                <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
                <rule name="StaticContent" patternSyntax="Wildcard">
                    <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                    </conditions>
                    <match url="*.*"/>
                </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="server.js"/>
                </rule>

                <rule name="SocketIO" patternSyntax="ECMAScript">
                    <match url="socket.io.+"/>
                    <action type="Rewrite" url="server.js"/>
                </rule>
            </rules>
        </rewrite>
        <directoryBrowse enabled="false"/>
    </system.webServer>
</configuration>

这是我的server.js文件的一般结构:

var http = require('http');
var express = require('express');
var fs = require("fs");
var sql = require("mssql");
var bodyParser = require('body-parser');         // Used to parse incoming messages
var Connection = require('tedious').Connection;  // Added for Azure

var app = express();
var port = process.env.port || 1337;

// pulls the index.html file
app.use(express.static(__dirname + "/"));

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

// DATABASE configuration
var config = {
    userName: 'USERNAME',
    password: 'PASSWORD',
    server:   'SERVER',   
    options: {
        encrypt: true,
        database: 'DATABASE',
        rowCollectionOnRequestCompletion: true
    }
};
var connection = new Connection(config);


// Server that listens to port 80
var server = http.createServer();

var server = app.listen(port, function () {

    var host = server.address().address
    var port = server.address().port

    console.log("Node Js app listening at http://%s:%s", host, port)

});



app.post('/postrequest', function (req, res) {
    // function 
});

感谢您的帮助。我似乎无法弄清楚这个问题。

我在一个单独的脚本中发布帖子请求,该脚本位于此目录中名为scripts的单独文件夹中:

xhttp.open("POST", "http://localhost:80/My Application/postrequest", false);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("date=" + date + "&name=" + name + "&type=" + type);

1 个答案:

答案 0 :(得分:0)

我能够通过在Web中使用以下配置将我的Node Web Application成功发布到IIS.Config:

<p class='jagged'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p><p class='jagged'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>

将我的server.js文件更改为:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="server.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="^server.js\/debug[\/]?"/>
         </rule>

         <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
         <rule name="StaticContent" patternSyntax="Wildcard">
               <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
               <conditions>
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
               </conditions>
            <match url="*.*"/>
         </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="server.js"/>
         </rule>

         <rule name="SocketIO" patternSyntax="ECMAScript">
               <match url="socket.io.+"/>
            <action type="Rewrite" url="server.js"/>
         </rule>
      </rules>
    </rewrite>

    <iisnode promoteServerVars="LOGON_USER" />

  </system.webServer>
</configuration>