PlatformNotSupportedException:此操作需要VS 2015中的IIS集成管道模式

时间:2017-06-20 21:51:41

标签: asp.net-mvc visual-studio-2015 owin iis-express

我在Visual Studio 2015中使用名为MvcIntegrationTestFramework的项目尝试对我的ASP.NET MVC项目运行单元测试时出现此错误。我已经搜索了大多数解决方案建议切换到使用IIS Express。但我已经在使用IIS Express了。我也可以设置IIS,但我不愿意,因为多个开发人员必须在他们的环境中做同样的事情。

其他人建议直接修改Response.Headers集合可能会导致此错误,但我没有看到项目中的任何代码可能会这样做。

还有什么你能想到的我可能会忽视这可能导致这个错误吗?

这是完整的错误和堆栈跟踪......

  

[PlatformNotSupportedException:此操作需要集成IIS   管道模式。] System.Web.HttpResponse.get_Headers()+ 242   Microsoft.Owin.Host.SystemWeb.OwinCallContext.CreateEnvironment()+532   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.GetInitialEnvironment(HttpApplication的   申请)+372
  Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.PrepareInitialContext(HttpApplication的   申请)+19
  Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.BeginEvent(对象   sender,EventArgs e,AsyncCallback cb,Object extradata)+354
  System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +673 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+146

1 个答案:

答案 0 :(得分:0)

我目前正在调查自己。到目前为止,我已经了解到:

  • HttpRuntime.UsingIntegratedPipeline可用于验证Http应用程序是否在集成管道中运行(顾名思义)
  • Microsoft.Web.Administration.ApplicationPool.ManagedPipelineMode属性可用于设置管道模式,但这仅在IIS应用程序中运行时有效
  • IntegratedPipelineMode仅在通过IIS运行HttpApplication时可用

  • MvcIntegrationTestFramework启动HttpApplication,但不使用IIS,因此无法使用IntegratedPipelineMode

检查HttpRuntime的参考源: https://referencesource.microsoft.com/#system.web/HttpRuntime.cs

这段代码表明UseIntegratedPipeline仅在某种IIS上下文中运行时才设置为true。它还表明_iisVersion仅在这种情况下被填充。

     internal static void PopulateIISVersionInformation() {
        if (IsEngineLoaded) {
            uint dwVersion;
            bool fIsIntegratedMode;
            UnsafeIISMethods.MgdGetIISVersionInformation(out dwVersion, out fIsIntegratedMode);

            if (dwVersion != 0) {
                // High word is the major version; low word is the minor version (this is MAKELONG format)
                _iisVersion = new Version((int)(dwVersion >> 16), (int)(dwVersion & 0xffff));
                _useIntegratedPipeline = fIsIntegratedMode;
            }
        }
    }

我调试了MvcIntegrationTestFramework的BrowsingSession类。 ProcessRequest方法将引发异常。在该方法中,可以查看HttpRuntime的属性:

HttpRuntime properties

_iisVersion为null的事实似乎证明了这一点。

我假设“应编辑” MvcIntegrationTestFramework以在IIS中运行HttpApplication。但是该框架的重点是模拟应用程序,因此这样做可能会破坏目的。