2012-05-10 3 views
6

Я использую iisnode для размещения веб-приложения узла в IIS в Windows. Когда я настраиваю свои маршруты на веб-сервере (скажем, Express или Restify), я хочу сделать это таким образом, который не зависит от пути, на котором IIS размещает приложение.Может ли веб-приложение, размещенное на iisnode, работать с виртуальным путем, на котором он размещен?

Например, мое приложение может размещаться на двух разных путях на двух машинах с IIS; первый мог разместить его на /foo, а второй - на /bar. Скажем, мое приложение хочет настроить маршрут по адресу /baz. На первом компьютере мне нужно будет настроить маршрут по адресу /foo/baz, а на втором я должен использовать /bar/baz, что означает дублирование некоторой конфигурации, хранящейся в IIS.

Возможно ли надежно выработать путь из приложения, размещенного в iisnode, чтобы я мог рассчитать правильные маршруты для настройки? Или есть другой метод, который я могу использовать, чтобы избежать необходимости делать это?

ответ

3

Я не знаю, как избежать сегмента пути, соответствующего виртуальному каталогу в вашем приложении node.js, размещенном в iisnode. Лучший способ гарантировать, что ваш код приложения является агностиком хоста, - разместить его в корневом каталоге веб-сайта IIS.

+0

Это не возможно в моем случае :( – GraemeF

+0

Это очень жаль ... Очень больно использовать виртуальную прямую во всех дорогах (изображения, таблицы стилей, маршруты, перенаправления ...) – Alvaro

2

@GraemeF: Это немного взломанный, но это тот, с кем я обошел это ограничение.

Во-первых, я добавил глобальную переменную в мое приложение под названием дома:

var express = require('express'), 
    app = express.createServer(), 
    home = process.env.deployPath || ''; 

Затем я создал свои маршруты с помощью домашней переменной:

app.get(home + '/baz', function(req, res) { 
    res.send('This is the /baz route'); 
    res.end(); 
}); 

Тогда, это просто вопрос установка deployPath appSetting в приложениях web.config:

машины 1:

<appSettings> 
    <add key="deployPath" value="/foo" /> 
</appSettings> 

машина 2:

<appSettings> 
    <add key="deployPath" value="/bar" /> 
</appSettings> 

Вы можете вручную установить значение на каждой машине, есть процесс сборки установить значение, или даже добавить параметр в глобальную web.config целевой машины.

+0

@Tomasz, возможно ли установить переменную среды процесса в HttpRuntime.AppDomainAppVirtualPath? Обычно я просто отправляю запрос на перенос, но я вообще не знаю C++. – Jason

+0

Это в значительной степени то, что я сделал, но на самом деле это не так. что мы делаем, мы просто обманываем, рассказывая об этом! Мне бы очень хотелось, чтобы вам не пришлось добавлять этот дополнительный шаг конфигурации (также, я не знаю, увидит ли Томаш ваше предложение!) – GraemeF

+0

I также создал проблему в github. – Jason

1

This answer предлагает получить путь от файла web.config.

Кроме того, this link может иметь некоторую помощь, а также:

решение оказывается хорошо решены, по крайней мере, для «экспресс» рамки приложений с использованием app.use()

Когда ты вызовите app.use (app.router), вы можете передать префикс пространства имен для своего виртуального каталога, а затем запросы будут успешными, но кто захочет жестко закодировать их имя виртуального каталога в своем приложении [yuck!]?

Решение оказалось довольно простым, потому что IISNODE поддерживает приложения appSettings для переменных окружения. Воспользовавшись этим фактом, вы можете добавить запись в веб-приложение.конфигурации, такие как:

<appSettings> 
     <add key="appvirtdir" value="/nodetest" /> 
</appSettings> 

Тогда вы можете сделать одну простую модификацию файла server.js так:

app.configure(function() { 
.... 
    app.use(process.env.appvirtdir || '', app.router); 
.... 
}); 
0

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

Вместо

server.get({ path: '/virtual/directory/structure/status/',... 

использование

server.get({ path: /.*\/status/,... 

и не будет никакой необходимости в магии.