将.NET Framework DLL公开为表现良好的Web服务

时间:2019-02-23 13:58:46

标签: asp.net .net visual-studio .net-framework-version

我试图找到公开和使用.NET Framework 4创建的现有DLL的最佳和最快方法(作为Web服务)。我无权访问现有DLL的代码,并且DLL本身仅公开一个接口

通过将现有的DLL导入到我的包装Visual Studio项目中并获得对DLL接口的引用,我已成功做到了:

    private MyCalculator initInterface()
    {
        string applicationBase = ConfigurationManager.AppSettings["DLL_LOCATION"];
        var appDomain = CreateAppDomain(applicationBase);
        string assemblyPath = Path.Combine(applicationBase, ConfigurationManager.AppSettings["DLL_NAME"]);
        return (MyCalculator)appDomain.CreateInstanceFromAndUnwrap(assemblyPath, ConfigurationManager.AppSettings["DLL_INTERFACE"]);
    }

    private static AppDomain CreateAppDomain(string applicationBase)
    {
        var info = new AppDomainSetup { ApplicationBase = applicationBase };
        var appDomain = AppDomain.CreateDomain("MyCalculator", null, info);
        string configPath = Path.Combine(applicationBase, "MyCalculator.config");
        appDomain.SetData("APP_CONFIG_FILE", configPath);
        return appDomain;
    }

当我在IIS上部署时,一切正常,但是我遇到了可怕的性能问题。 1)如果包装纸没有被打过一段时间,可能需要20到30秒的时间 2)预热后,仍然可能需要3-5秒才能得出结果。

注意:我已将“开始模式”配置为“始终运行”,并将“空闲超时”操作配置为“暂停”。

当我在没有IIS或任何其他开销的情况下原生调用DLL时,看到的响应时间约为0.25-〜0.5秒。

我在Google上搜索了很多,并且看到与包装非托管DLL相关的1000多个不同的线程,方法和建议。但是,有些非常旧,建议使用WCF,而较新的则建议使用MVC5。因此,需要一些有关如何最好地进行的建议。

如果有更简单的方法/更有效的方法,很高兴抛弃我已经创建的内容(例如包装器)。同样,如果在我创建的内容中有更好的实现方式,那也很好!

在此先感谢您的任何建议或指导!

其他注意事项/注释:

1)该解决方案仅需要公开此DLL的功能,并且将由其他服务器上的现有(非Windows)应用程序使用。 2)包装器/ DLL不会面向公众等,只会由上述现有应用程序调用。 3)使用IIS托管包装程序没有问题,但是很明显,这增加了不必要的开销(就IIS带来的所有其他事情和开销而言)

0 个答案:

没有答案