Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 从ASP.NET调用的Python脚本在IIS Express中运行良好,但在本地IIS中失败_C#_Python_Asp.net_Iis_Arcgis - Fatal编程技术网

C# 从ASP.NET调用的Python脚本在IIS Express中运行良好,但在本地IIS中失败

C# 从ASP.NET调用的Python脚本在IIS Express中运行良好,但在本地IIS中失败,c#,python,asp.net,iis,arcgis,C#,Python,Asp.net,Iis,Arcgis,这可能表面上看起来像一个复制品,但这是不同的,因为 它使用ArcGIS 10.0,在以后的版本中有很大的不同 我正在使用的10.3等版本 这指的是安装的Python的多个版本,而我只安装了 有一个 这是指我已经完成的卸载和重新安装 指的是不同的操作系统(我运行的是Win2012) 这指的是一个错误持续发生,而我得到 错误仅来自IIS 我有一个调用Python脚本的ASP.NET应用程序。代码使用System.Diagnostics.Process对象调用Python.exe并向其传递参数,如P

这可能表面上看起来像一个复制品,但这是不同的,因为

  • 它使用ArcGIS 10.0,在以后的版本中有很大的不同 我正在使用的10.3等版本
  • 这指的是安装的Python的多个版本,而我只安装了 有一个
  • 这是指我已经完成的卸载和重新安装
  • 指的是不同的操作系统(我运行的是Win2012)
  • 这指的是一个错误持续发生,而我得到 错误仅来自IIS

    我有一个调用Python脚本的ASP.NET应用程序。代码使用System.Diagnostics.Process对象调用Python.exe并向其传递参数,如Python脚本的位置和其他参数。 该进程对象在C中看起来像这样#

    Path和PYTHONPATH环境变量精确地指向Python可执行文件所在的位置

    当我在VisualStudio2015的IIS Express中从ASP.NET C#应用程序运行Python脚本时,一切运行正常。当我通过命令控制台运行Python脚本时,一切运行正常。当我从空闲状态运行Python脚本时,一切运行正常。但是,当我将应用程序发布到IIS8.5并运行它时,Python脚本中出现了一个错误。另外,当我从VisualStudio运行应用程序并使用本地IIS而不是IIS Express时,Python脚本再次失败

因此,这里是它工作条件的概述:

  • 在IIS Express中的ASP.NET C#应用程序中运行Python脚本 Visual Studio 2015
  • 通过命令控制台运行Python脚本
  • 从空闲状态运行Python脚本
  • 以下是对其不起作用的情况的概述:

  • 从本地IIS Express中的ASP.NET C#应用程序运行Python脚本 在Visual Studio 2015中
  • 在IIS上从ASP.NET C#应用程序运行Python脚本
  • 错误的要点是脚本行“import acrpy”上的“RuntimeError:NotInitialized”。这列在下面的“error#1”下。在VS(本地IIS或IIS Express)中运行它与在常规IIS中运行它的唯一区别是权限

    当我在Visual Studio中运行它时,Visual Studio应用程序具有管理员权限。 在IIS中,身份验证设置为启用Windows身份验证。其他一切都被禁用。 以下是应用程序在IIS 8.5中运行以及在Visual Studio中与本地IIS一起运行时发生的完整错误消息

    错误#1:

    这导致了以下错误:

    错误#2:

    本地IIS,已启用模拟,标识=x12345:

    IIS Express:

    请注意,在启用模拟的情况下运行与使用IIS Express运行相同的标识会导致相同的环境变量。 这告诉我,在开始启用ASP.NET模拟时,也许我应该把重点放在如何实现这一点上,因为正如我前面提到的,使用IIS Express运行始终是成功的。看来,尽可能地模仿那些已知的成功条件对我有利。 在我看来,将精力集中在找出为什么与IIS Express使用相同环境用户的ASP.NET模拟无法运行脚本上是合理的。欢迎提出意见和建议

    编辑(2016年5月19日下午1:40):

    我尝试在“IIS管理服务”属性和W3SVC属性中启用“允许服务与桌面交互”选项。这没有帮助

    我的下一个尝试是创建一个web服务,它调用Python可执行文件并返回结果。我将让当前的ASP.NET应用程序调用web服务,然后返回结果。 除非有人对为什么这不起作用有意见,或者对如何使当前ASP.NET应用程序按预期运行有意见,否则我将继续使用web服务策略

    编辑(2016年5月25日)

    看来我终于成功了,经过近3周的努力

    虽然我到底做了什么让它工作还没有定论,但下面是我做的两件主要事情

    我使用托管在IIS中的basicHttpBinding创建了一个WCF服务。wsHttpBinding不适用于我,因为当我尝试将其配置为Windows身份验证并设置mode=“transport”时,我收到一个错误,指出需要ssl

    更重要的是,我将WCF服务的应用程序池的进程标识从ApplicationPoolIdentity更改为具有提升权限的帐户

    现在,当我在任务管理器中查看w3wp.exe用户名时,我看到它正在以该帐户的名称运行

    我的下一步是开始顺序撤销所有以前的配置,并测试哪些配置是不必要的。例如,我在包含使用的Python脚本和可执行文件的文件夹的安全访问中添加了应用程序池帐户。 现在我认为这可能是不必要的,因为w3wp可以通过其新帐户访问Python脚本。我将开始删除以前添加的其他帐户

    事后来看,我认为创建web服务在技术上可能没有必要,因为我可能刚刚能够更改运行ASP.NET应用程序的应用程序池的进程标识。但是,由于ASP.NET应用程序可由用户直接访问,而web服务只能间接访问,因此可能存在安全问题,即使此应用程序是intranet应用程序,并且没有面向外部的接口


    任何关于我如何使其发挥作用的见解(建议和/或建设性批评)都将不胜感激。

    我对此做了更多的研究,现在我明白了为什么我的解决方案会起作用
        Process proc = new Process();
    proc.StartInfo.Verb = "runas";     
    proc.StartInfo.FileName = pathToPythonExe;
    proc.StartInfo.Arguments = procArgs;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    proc.Start();
    proc.WaitForExit();            
    errorToConsole = proc.StandardError.ReadToEnd();
    proc.WaitForExit();
    messageToConsole = proc.StandardOutput.ReadToEnd();
    proc.WaitForExit();
    
    Traceback (most recent call last):
      File "E:\Application Development\PublishServiceDefinition\MapPublisher\MapSdDraftCreator.py", line 1, in <module>
        import arcpy
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\__init__.py", line 21, in <module>
        from arcpy.geoprocessing import gp
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\__init__.py", line 14, in <module>
        from _base import *
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\_base.py", line 598, in <module>
        env = GPEnvironments(gp)
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\_base.py", line 595, in GPEnvironments
        return GPEnvironment(geoprocessor)
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\_base.py", line 551, in __init__
        self._refresh()
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\geoprocessing\_base.py", line 553, in _refresh
        envset = (set(env for env in self._gp.listEnvironments()))
    RuntimeError: NotInitialized
    
    import arcinfo
    import arcpy
    
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\__init__.py", line 21, in <module>
        from arcpy.geoprocessing import gp
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\__init__.py", line 14, in <module>
        from _base import *
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\_base.py", line 598, in <module>
        env = GPEnvironments(gp)
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\_base.py", line 595, in GPEnvironments
        return GPEnvironment(geoprocessor)
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\_base.py", line 551, in __init__
        self._refresh()
      File "e:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\_base.py", line 553, in _refresh
        envset = (set(env for env in self._gp.listEnvironments()))
    RuntimeError: NotInitialized
    
    Traceback (most recent call last):
      File "E:\Application Development\PublishServiceDefinition\MapPublisher\MapSdDraftCreator.py", line 1, in <module>
        import arcinfo
      File "E:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcinfo.py", line 18, in <module>
        gp.setProduct("ArcInfo")
    RuntimeError: ERROR 999999: Error executing function.
    
    Environment.UserDomainName = "IIS APPPOOL"
    Environment.UserName = .NET v4.5
    
    Environment.UserDomainName = x12345
    Environment.UserName = ABC
    
    Environment.UserDomainName = x12345
    Environment.UserName = ABC
    
    var envVars = Environment.GetEnvironmentVariables();
    
    // ["APPDATA"] = "C:\\Users\\AHejlsberg.MS\\AppData\\Roaming"
    
    ProcessStartInfo procInfo = proc.StartInfo;
    
    // Environment = {System.Collections.Specialized.StringDictionary.GenericAdapter}
        // Count = 43        
            // [19] = {[APPDATA, C:\Windows\system32\config\systemprofile\AppData\Roaming]}
    
    // Environment = {System.Collections.Specialized.StringDictionary.GenericAdapter}
        // Count = 49     
            // [21] = {[APPDATA, C:\Users\AHejlsberg.MS\AppData\Roaming]}