2016-02-01 2 views
4

Я ищу, чтобы медленно преобразовать приложение Node.js в ASP.NET WebAPI 2.0. В настоящее время я использую IIS и буду придерживаться IIS. Итак, я хотел бы разместить их на одном сервере, но перенаправить некоторые URI на новую платформу.Запустите node.js & WebAPI на том же сервере для того же сайта с IIS

Как бы это сделать в web.config? В настоящее время web.config для 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 
     - ... 

Я думал, что я должен писать новое правило, в котором перечислены идентификаторы URI, чтобы перейти к WebAPI. Но я не совсем уверен, как это сделать. Я предполагаю, что я бы добавил условие для каждого URI с атрибутом input. Я также думал, что должен указать на проект ASP.NET WebAPI, но я еще более не знаю, как мне следует это делать с Node.js Я просто указываю на файл app.js.

+0

Я думаю, что должно быть 'match' тегов в вашей 2-й и 3-го правила тега. и действие должно быть чем-то вроде ''. {R: 1} соответствует части в URL-адресе. Поскольку я не знаю, какое правило вы хотите применить, вы можете привести пример. – kiro

+0

спасибо за указатель @kiro. Я не уверен, относится ли это к тому, что я делаю, поскольку исходный файл node.js 'web.config' отлично работает. Вы можете увидеть, что мне нужно сделать в решении ниже. При попытке создания отдельных проектов я делал несколько ошибок. – Jon49

ответ

0

ОК, это то, что я закончил делать. Это было довольно прямолинейно. Но когда вы не знакомы с IIS, это может быть сложно.

Я положил оригинал web.config в каталог node. Я думаю, что обработчик iisnode вмешивается в конфигурацию WebAPI, если вы этого не сделаете. Так, в каталоге node новый node.jsweb.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> 

Для корня web.config Я сделал это указывает на статические файлы напрямую, минуя node.js. Это означает, что мне нужно будет написать какой-то пользовательский код для обработки перезаписи для файлов gzipped. Я объясню это позже. Я также добавил атрибут stopProcessing к каждому rewriterule. Это также испортило код, так как на самом деле он не переписал бы то, что я тоже хотел, поскольку переписывание будет перезаписано. Обратите внимание, что заголовок версии accept на самом деле еще не протестирован - у меня нет причин полагать, что это не сработает. Последние rewrite указывают все uri s на приложение 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> 
Смежные вопросы