Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用单独的AppDomain运行时,SSI在验证后被卡住_C#_Ssis_Appdomain - Fatal编程技术网

C# 使用单独的AppDomain运行时,SSI在验证后被卡住

C# 使用单独的AppDomain运行时,SSI在验证后被卡住,c#,ssis,appdomain,C#,Ssis,Appdomain,我们有一个web应用程序,它与作为Windows服务设置的本地可执行文件协同工作。根据设计,web应用程序应该通过服务处理所有批处理作业(它可以自己运行,也可以自己运行,只是不是预期的设计和我无法控制的东西)。其中一个批处理作业执行SSIS包。当服务执行SSIS包时,我们偶然发现了一个问题,以至于在运行包两次以上后,服务被卡住。此时,我们必须重新启动服务,以允许它再次运行SSIS包。如果在本地调试代码或在服务外部运行代码时运行相同的作业,则不会遇到此问题。我们发现的主要区别是,我们的服务在自己的

我们有一个web应用程序,它与作为Windows服务设置的本地可执行文件协同工作。根据设计,web应用程序应该通过服务处理所有批处理作业(它可以自己运行,也可以自己运行,只是不是预期的设计和我无法控制的东西)。其中一个批处理作业执行SSIS包。当服务执行SSIS包时,我们偶然发现了一个问题,以至于在运行包两次以上后,服务被卡住。此时,我们必须重新启动服务,以允许它再次运行SSIS包。如果在本地调试代码或在服务外部运行代码时运行相同的作业,则不会遇到此问题。我们发现的主要区别是,我们的服务在自己的独立AppDomain中运行作业。创建该AppDomain的逻辑如下所示:

private AppDomain CreateAppDomain(string applicationName)
{
    var uid = Guid.NewGuid();
    var fi = new FileInfo(Assembly.GetExecutingAssembly().Location);
    var info = new AppDomainSetup
    {
        ConfigurationFile = @"D:\Deploy\App\web.config",
        ApplicationBase = @"D:\Deploy\App",
        ApplicationName = applicationName,
        CachePath = fi.Directory.Parent.FullName + @"\Temp",
        ShadowCopyDirectories = @"D:\Deploy\App\bin",
        PrivateBinPath = "bin",
        ShadowCopyFiles = "true"
    };

    var domain = AppDomain.CreateDomain(uid.ToString(), null, info);
    return domain;
}
这一点可以归结为以下几行代码:

var domain = CreateAppDomain("DomainOfInstance1");

                // Use thread info from the calling process
                if (threadPrincipal != null)
                {
                    domain.SetThreadPrincipal(threadPrincipal);
                }
                
                var tt = (LocalWindowsService)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(LocalWindowsService).FullName, false, BindingFlags.Default, null, null, null, null);
                tt.OnThreadDone += LocalWindowsService_OnThreadDone;
                id = tt.StartJob(id, parameters);

                Debug.WriteLine(string.Format("started job: {0}", id));
执行包的对应代码为:

        var ssisRunEventHandler = new SsisRunEventHandler(sqlObject, process);
        Package.Execute(null, null, ssisRunEventHandler, null, null);
如果我在调试时使用本地计算机调用作业,或通过托管在C:\Windows.NET中的Web应用程序的应用程序池调用作业。。我可以随时运行SSIS,而不是D:\Deploy\App。但是,当相同的Package.Execute代码通过AppDomain运行时,在对任何SSIS包调用两次Execute后,SSIS在post validate时冻结

我们发现的解决方法是显式调用AppDomain.Unload(domain)以防止其冻结,但在我看来,这就像是一种黑客行为——因此,我们得到了关于domain Unload和thread abort异常的异常。我希望能更多地了解它的底细,但这只是我的领域之外的一种方式,我想知道是否有工具可以帮助我了解当包在单独的领域上运行时,integration services中遇到了什么问题。事件查看器和/或我们自己的日志中也没有任何异常(我启用了包日志)

是否有人遇到过同样的问题,并对我可以使用哪些工具(如果有)来解决更多问题提出了建议

不确定是否有帮助,但有一些额外的细节: SQL Server数据库是2016年的 v13.0.0.0上的集成服务 在到目标的连接字符串中使用SQLNCLI11作为提供程序 分隔文件作为我们的源