Microsoft.Owin.Hosting.WebApp.Start 从 Windows 服务中公开的 URL 无法在远程计算机上访问
Urls exposed by Microsoft.Owin.Hosting.WebApp.Start from within Windows Service are not accessible on remote machines
我创建了一个 Windows 服务(使用 Topshelf 包),它使用 WebApp.Start 来监听 http 请求。我的代码如下:
var options = new StartOptions();
options.Urls.Add( "http://localhost:9095" );
options.Urls.Add( "http://127.0.0.1:9095" );
options.Urls.Add( $"http://{ConfigurationHelper.IPAddress}:9095" );
options.Urls.Add( $"http://{Environment.MachineName}:9095" );
Microsoft.Owin.Hosting.WebApp.Start<Startup>( options );
当我在 Windows 服务机器上浏览时,我可以点击所有需要的 URLs,但是当我在同一网络上的远程机器上访问该机器时,我在点击 URL(即 http://192.168.100.14:9095/hangfire/)时收到 500 错误。
一些注意事项:
Windows 防火墙已关闭,但我仍在与 IT 确认我们的硬件防火墙是否可能阻止了某些内容(如果是的话,我们会得到 500 还是 404? )
windows 服务是 运行 作为管理员组一部分的本地用户。
对于每个 URL,我 运行 netsh
命令:netsh http add urlacl url=http://127.0.0.1:9095/ user=myAdminUser
关于我为什么会得到 500 或如何在任何地方查看任何诊断信息的任何其他想法? (调试视图和事件查看器什么都没有)。
这是我的第一个 Owin 应用程序,所以我还很陌生。
更新:OWIN 错误跟踪
[8496] BTR.Evolution.Service OWIN Exception: Object reference not set to an instance of an object.
[8496]
[8496] at Hangfire.Dashboard.MiddlewareExtensions.Unauthorized(IOwinContext owinContext)
[8496] at Hangfire.Dashboard.MiddlewareExtensions.<>c__DisplayClass1_2.b__1(IDictionary`2 env)
[8496] at Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext()
[8496] --- End of stack trace from previous location where exception was thrown ---
[8496] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[8496] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[8496] at BTR.Evolution.Service.GlobalExceptionMiddleware.d__1.MoveNext() in C:\BTR\Source\Evolution.Service\BTR.Evolution.Service\Startup.cs:line 20
所以也许罪魁祸首不是 OWIN,而是 Hangfire 和我试图远程使用它。将查看授权过滤器以查看是否有帮助。
研究如何通过创建 OWIN 中间件记录器从异常中获取堆栈跟踪。有关详细信息,请参阅 。
根据包含堆栈跟踪的更新判断,您需要查看 hangfire 中的身份验证问题。查看 http://docs.hangfire.io/en/latest/configuration/using-dashboard.html#configuring-authorization - 这表明出于安全原因,默认情况下仅允许本地请求。它还提供了显示如何使用 IAuthorizationFilter
允许远程请求的示例代码。
我创建了一个 Windows 服务(使用 Topshelf 包),它使用 WebApp.Start 来监听 http 请求。我的代码如下:
var options = new StartOptions();
options.Urls.Add( "http://localhost:9095" );
options.Urls.Add( "http://127.0.0.1:9095" );
options.Urls.Add( $"http://{ConfigurationHelper.IPAddress}:9095" );
options.Urls.Add( $"http://{Environment.MachineName}:9095" );
Microsoft.Owin.Hosting.WebApp.Start<Startup>( options );
当我在 Windows 服务机器上浏览时,我可以点击所有需要的 URLs,但是当我在同一网络上的远程机器上访问该机器时,我在点击 URL(即 http://192.168.100.14:9095/hangfire/)时收到 500 错误。
一些注意事项:
Windows 防火墙已关闭,但我仍在与 IT 确认我们的硬件防火墙是否可能阻止了某些内容(如果是的话,我们会得到 500 还是 404? )
windows 服务是 运行 作为管理员组一部分的本地用户。
对于每个 URL,我 运行
netsh
命令:netsh http add urlacl url=http://127.0.0.1:9095/ user=myAdminUser
关于我为什么会得到 500 或如何在任何地方查看任何诊断信息的任何其他想法? (调试视图和事件查看器什么都没有)。
这是我的第一个 Owin 应用程序,所以我还很陌生。
更新:OWIN 错误跟踪
[8496] BTR.Evolution.Service OWIN Exception: Object reference not set to an instance of an object.
[8496]
[8496] at Hangfire.Dashboard.MiddlewareExtensions.Unauthorized(IOwinContext owinContext)
[8496] at Hangfire.Dashboard.MiddlewareExtensions.<>c__DisplayClass1_2.b__1(IDictionary`2 env)
[8496] at Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext()
[8496] --- End of stack trace from previous location where exception was thrown ---
[8496] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[8496] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[8496] at BTR.Evolution.Service.GlobalExceptionMiddleware.d__1.MoveNext() in C:\BTR\Source\Evolution.Service\BTR.Evolution.Service\Startup.cs:line 20
所以也许罪魁祸首不是 OWIN,而是 Hangfire 和我试图远程使用它。将查看授权过滤器以查看是否有帮助。
研究如何通过创建 OWIN 中间件记录器从异常中获取堆栈跟踪。有关详细信息,请参阅
根据包含堆栈跟踪的更新判断,您需要查看 hangfire 中的身份验证问题。查看 http://docs.hangfire.io/en/latest/configuration/using-dashboard.html#configuring-authorization - 这表明出于安全原因,默认情况下仅允许本地请求。它还提供了显示如何使用 IAuthorizationFilter
允许远程请求的示例代码。