Отправленные сервером события не работают со службой приложений Windows в Azure

Я попытался запустить следующий код в службе приложений Windows в Azure:

const http = require('http');

const server = http.createServer((request, response) => {

  response.setHeader('Content-Type', 'text/event-stream');
  response.setHeader('Cache-Control', 'no-cache');
  response.setHeader('Connection', 'keep-alive');
  response.setHeader('Transfer-Encoding', 'chunked');
  response.flushHeaders();

  var interval = setInterval(function () {
      response.write("data: extra data\n\n");
  }, 1000);

  request.on('close', function () {
    clearInterval(interval);
  })
});

const port = process.env.PORT || 1337;
server.listen(port);

console.log("Server running at http://localhost:%d", port);

Он работает, когда я запускаю его локально, но не работает при развертывании в службе приложений.

Мой web.config выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<!--
     This configuration file is required if iisnode is used to run node processes behind
     IIS or IIS Express.  For more information, visit:

     https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config
-->

<configuration>
  <system.webServer>
    <!-- Visit http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx for more information on WebSocket support -->
    <webSocket enabled="false" />
    <handlers>
      <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module -->
      <add name="iisnode" path="app.js" verb="*" modules="iisnode" responseBufferLimit="0"/>
    </handlers>
    <rewrite>
      <rules>
        <!-- Do not interfere with requests for node-inspector debugging -->
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^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="public{PATH_INFO}"/>
        </rule>

        <!-- All other URLs are mapped to the node.js site entry point -->
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
          </conditions>
          <action type="Rewrite" url="app.js"/>
        </rule>
      </rules>
    </rewrite>
    
    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin"/>
        </hiddenSegments>
      </requestFiltering>
    </security>

    <!-- Make sure error responses are left untouched -->
    <httpErrors existingResponse="PassThrough" />

    <!--
      You can control how Node is hosted within IIS using the following options:
        * watchedFiles: semi-colon separated list of files that will be watched for changes to restart the server
        * node_env: will be propagated to node as NODE_ENV environment variable
        * debuggingEnabled - controls whether the built-in debugger is enabled

      See https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config for a full list of options
    -->
    <!--<iisnode watchedFiles="web.config;*.js"/>-->
    <iisnode flushResponse="true" />
  </system.webServer>
</configuration>

Я добавил в <iisnode flushResponse="true" /> и responseBufferLimit="0" в соответствии с предложениями из документации службы приложений Microsoft: https://docs.microsoft.com/en-us/azure/app-service/app-service-web-nodejs-best-Practices-and-Troubleshoot-guide#flushresponse, но все равно безрезультатно.


person rndware    schedule 18.09.2020    source источник
comment
Суть этой проблемы - научиться устранять неполадки. Пожалуйста, обратитесь к моему предложению, атрибуты, которые необходимо изменить, добавляйте и проверяйте шаг за шагом в web.config файл.   -  person Jason Pan    schedule 21.09.2020
comment
Это вполне может быть так, но я не знаю, как дальше устранять эту проблему. Есть ли способ отладки файла web.config? Есть ли рабочий пример проекта примера событий, отправленных сервером, куда вы можете направить меня, где это работает?   -  person rndware    schedule 21.09.2020


Ответы (1)


Ваш проект может запускаться локально, то есть через командную строку npm start, npm run dev и т. Д., Чтобы запустить webapp локально. В настоящее время файл web.config использоваться не будет. Если вы не развернете проект в локальном IIS, IIS распознает web.config файл.

Предполагая, что с вашим проектом нет проблем, я думаю, вы можете сначала удалить свой web.config файл (необходимо создать резервную копию). Затем используйте git для развертывания, а затем с помощью kudu найдите web.config, автоматически сгенерированный развертыванием (также необходимо создать резервную копию, потому что последующие операции изменят исходный файл, если модификация неправильная, вы можете восстановить его).

Сообщение о развертывании git для автоматического создания web.config.

  1. Сравните разницу между содержимым web.config в вашем текущем проекте и автоматически созданным развертыванием git и добавьте нужные функции и содержимое, например _10 _, _ 11_.

  2. Если что-то пойдет не так, не забудьте восстановить файл резервной копии. Это можно использовать для устранения неполадок.

person Jason Pan    schedule 21.09.2020
comment
файл web.config был автоматически сгенерирован при первоначальном развертывании приложения, после чего я изменил его, чтобы он выглядел так, как показано выше. Я изменил файл web.config раньше на недопустимый синтаксис, и это вызвало ошибку 500, поэтому я знаю, что он пытается его прочитать. - person rndware; 21.09.2020