У нас есть обычное веб-приложение asp.net и добавлена аутентификация OpenID Connect на основе Owin (AzureAD). На моей локальной машине на IIS Express запуск Owin вообще не был запущен, даже если была Microsoft.Owin.Host.SystemWeb dll, мы пробовали также с настройками, такими как owin:AutomaticAppStartup
и owin:appStartup
, ничего не изменилось.
Единственное решение, которое заставило Овина работать локально, состояло в том, чтобы Инициализировать его в Global.asax.cs ctor WebApplication, вызвав Microsoft.Owin.Host.SystemWeb.PreApplicationStart.Initialize();
При развертывании в Azure (облачная служба, у нас есть доступ к виртуальной машине) на IIS приложение запускает следующую трассировку стека во время запуска веб-роли:
[InvalidOperationException]: Operation is not valid due to the current state of the object.
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.PushLastObjects(IDictionary`2 environment, TaskCompletionSource`1 completionSource)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.Epilog(IDictionary`2 env)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.DefaultAppInvoked(IDictionary`2 env)
at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.<DoFinalWork>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)
at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
-->
Кто-нибудь знает, где и что может быть причиной проблемы? У меня нет глубокого понимания внутренних компонентов Owin и того, как инициализируется конвейер, поэтому я не уверен, основываясь на этой трассировке, происходит ли это при запуске приложения или во время фактического запроса, но так как он не содержит никакого кода нашей реализации Я полагаю, это не удается при запуске. Может быть, на обычном IIS Owin запускался нормально, в отличие от IIS Express, и этот дополнительный вызов в Global.asax вызывает это странное исключение?