0

我正在运行iisnode并使用 edge.js 访问第 3 方 DLL 中的代码。此代码期望有一个web.config文件可以从中提取连接字符串。

文件结构:

\noderoot\bin\my3rdParty.dll
\noderoot\cs\myCode.cs
\noderoot\api.js
\noderoot\server.js
\noderoot\web.config

cs\myCode.cs

using System;
using System.Threading.Tasks;
using My3rdPartyNamespace;

public class Startup {
    public async Task<object> Invoke(dynamic input) {
        // My3rdPartyObject.DoSomeStuff() looks at ConfigurationManager.ConnectionStrings
        return My3rdPartyObject.DoSomeStuff((string)input.someThing);
    }
}

api.js

import {Router} from 'express';
import Edge from 'edge';
import path from 'path';

let router = Router();

router.post('/doAThing', (req, res, next) => {
    let aThing = Edge.func({
        source: path.join(__dirname, 'cs/myCode.cs'),
        references: [
            'System.Web.dll',
            './bin/my3rdParty.dll'
        ]
    });

    let payload = {
        someThing: req.body.someThing
    };

    let response = aThing(payload, true);
    res.json(response);
});

export default router;

我尝试将连接字符串放在web.configiisnode 使用的文件中,但显然 edge.js 不在那里。当我将连接字符串放入node.exe.config并将该文件放入时它可以工作c:\program files\nodejs,但这是一个不可接受的解决方案。

同样,我使用 edge.js 的重点是我可以使用第三方 DLL,所以我不能简单地告诉 DLL 我的连接字符串是什么,除非我可以强行将它插入ConfigurationManager.ConnectionStrings.

不能使用 edge-sql,因为我没有编写任何 SQL——dll 已经处理了 SQL。我无法使用环境变量设置连接字符串,EDGE_SQL_CONNECTION_STRING因为 dll 正在web.config.

想法?

4

1 回答 1

3

Edge.js 不知道使用 iisnode 托管在 IIS 中,因此不使用 web.config。iisnode 充当 node.exe 的 HTTP 反向代理,它运行作为应用程序一部分的 HTTP 侦听器。此 node.exe 和其中的任何代码都表现为一个独立的应用程序,否则您可以从命令行启动。因此,Edge.js 只会考虑与运行应用程序的 node.exe 可执行文件位于同一目录中的 node.exe.config 文件(https://github.com/tjanczuk/edge#how-to-appconfig) .

我认为放置连接字符串c:\program files\nodejs是不可接受的,因为它在机器上的多个应用程序之间共享,可能由不同的用户运行。

有办法解决它。nodeProcessCommandLine您可以使用配置属性 ( https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/iisnode.yml#L13 )将 iisnode 配置为在自定义位置运行 node.exe 。具体来说,您可以将 node.exe 作为应用程序的一部分上传,指向nodeProcessCommandLine使用该私有副本,然后将node.exe.config连接字符串放在该私有 node.exe 旁边。

作为旁注,我建议将调用Edge.func放在上面的代码片段中的全局范围内,以便它只运行一次,而不是在每个 HTTP 调用上运行。

于 2016-01-24T04:27:07.083 回答