【问题标题】:Permissions Hosting .NET Core out-of-process with files on a network drive使用网络驱动器上的文件在进程外托管 .NET Core 的权限
【发布时间】:2019-12-05 17:49:13
【问题描述】:

我有一个新的 .NET Core API,它针对完整的 .Net 框架,因此在 IIS 中托管在进程外。这在 Visual Studio 中本地运行良好,在使用 IIS 的测试环境中也很好,但是部署到生产中这不起作用。我可以看到的区别是测试环境有一个带有 API 文件的本地驱动器,生产 API 文件在 IIS 中使用 UNC 路径设置,应用程序池作为对网络文件夹具有完全访问权限的域用户运行。 API 无法启动并出现错误,事件日志中的消息如下所示,包括无法写入日志标准输出。但是,如果我将应用程序池设置为作为域管理员帐户运行,那么一切都很好并且 API 运行。当然,我不能以该用户身份运行,所以我的问题是我在这里缺少什么权限或信任级别。我是 .NET Core 的新手,所以我不确定可能需要哪些额外权限。其他完整的 .NET Framework 网站和服务在此服务器上运行正常,其文件在此网络驱动器上。

以下是作为非管理员域用户运行应用程序池时的事件日志消息。

源的应用程序事件日志:“IIS AspNetCore Module V2”警告:“无法创建 stdoutLogFile \?\UNC\fileclstr\Websites\WebsiteName\API\logs\stdout_20191205204322_15236.log,错误代码 = '0x800700a1'。”

源的应用程序事件日志:.NET 运行时错误:“应用程序:DistributedServices.WebsiteName.exe 框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.Net.Sockets.SocketException 在 System.Net.Sockets.Socket..ctor(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType) 在 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.BindAsync() 在 Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer+c__DisplayClass21_01+<<StartAsync>g__OnBind|0>d[[Microsoft.AspNetCore.Hosting.Internal.HostingApplication+Context, Microsoft.AspNetCore.Hosting, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]].MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+<BindEndpointAsync>d__3.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions+<BindAsync>d__43.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+AddressesStrategy+<BindAsync>d__2.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+<BindAsync>d__0.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer+<StartAsync>d__211[[Microsoft.AspNetCore.Hosting.Internal.HostingApplication+Context,Microsoft.AspNetCore.Hosting,版本=2.2.0.0,文化=中性,PublicKeyToken =adb9793829ddae60]].MoveNext() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) 在 Microsoft.AspNetCore.Hosting.Internal.WebHost+d__26.MoveNext() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) 在 Microsoft.AspNetCore.Hosting.WebHostExtensions+d__5.MoveNext() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) 在 Microsoft.AspNetCore.Hosting.WebHostExtensions+d__4.MoveNext() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) 在 Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(Microsoft.AspNetCore.Hosting.IWebHost) 在 DistributedServices.WebsiteName.Program.Main(System.String[])"

源的应用程序事件日志:“应用程序错误”错误:“错误应用程序名称:DistributedServices.WebsiteName.exe,版本:1.0.0.0,时间戳:0xf4041a68 错误模块名称:KERNELBASE.dll,版本:10.0.14393.3321,时间戳:0x5da7e8d8 异常代码:0xe0434352 故障偏移:0x000dc232 故障进程 ID:0x2bf8 错误应用程序启动时间:0x01d5abaca2aaaf51 错误的应用程序路径:\fileclstr\Websites\WebsiteName\API\DistributedServices.WebsiteName.exe 错误模块路径:C:\Windows\System32\KERNELBASE.dll 报告 ID:c68c4bdd-e46d-4628-8be3-63b1f6cc78dc 故障包全名: 错误的包相关应用程序 ID:“

应用程序事件日志源:“IIS AspNetCore 模块 V2”警告:“应用程序 '/LM/W3SVC/1/ROOT/api' 与物理根目录 '\fileclstr\Websites\WebsiteName\API\' 无法使用命令行启动进程' \fileclstr\Websites\WebsiteName\API\DistributedServices.WebsiteName.exe '在阶段 'PostStartCheck',ErrorCode = '0x8027025b',分配端口 38520,retryCounter '1'。"

这是 web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
      <clear />
    </httpErrors>
    <aspNetCore processPath=".\DistributedServices.WebSiteName.exe" arguments="" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout"  />
  </system.webServer>
</configuration>

提前感谢您的任何建议。

Asp.net Core 2.2、kestrel 进程外、IIS10、Windows Server 2016。

【问题讨论】:

  • 我建议您遵循最佳实践,不要因为奇怪的方法而尝试解决问题。构建、发布、部署。不要通过网络共享服务应用程序。
  • “API 无法启动并抛出套接字异常”,请编辑您的问题以包含实际异常。 “无法写入日志标准输出”,进程监视器对文件访问有何看法?
  • 嗨弗拉基米尔,我的描述可能不太清楚。但我们使用 Azure DevOps 管道进行构建和部署。我们只是出于应用原因使用共享存储。我想在这里关注的是 Core out of process 如何与权限一起工作,以及为什么 API 在我的管理员帐户上运行良好,而不是在运行应用程序池的非管理员帐户下运行。谢谢。
  • Lex Li,感谢您的反馈。我已经更新,现在包含事件日志错误和警告。
  • 我已更新 web.config 以输出到 C 驱动器上的文件夹,这已创建日志,在启动时显示它因套接字异常而失败,但它正在尝试连接到 SQL Server和失败。 SQL Server 使用集成安全性,以运行应用程序的用户身份连接,所以我认为这是问题所在,以及未在共享上创建日志。我认为 out of proc 应用程序没有作为我的应用程序池身份运行,有什么想法可以控制它运行的用户吗?应用程序池身份是进程外的方式吗?谢谢。

标签: asp.net-core-2.2 windows-server-2016 iis-10 kestrel-http-server


【解决方案1】:

这花了很多天,但我终于到了那里。

用户对 \\fileclstr\Websites\WebsiteName\ 拥有权限,但这似乎还不够,并且授予 \\fileclstr\Websites\ 权限允许它在 IIS 进程外模式下运行 .NET Core完整的框架。

感谢您的 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多