简体   繁体   English

在IIS7上部署ASP.NET Web API时出错

[英]Error when deploying ASP.NET Web API on IIS7

I develop ASP.NET Web API app which is working fine when I run it under Visual Studio 2010. It runs and works just perfect. 我开发了ASP.NET Web API应用程序,当我在Visual Studio 2010下运行该应用程序时,它可以很好地运行。它运行起来非常完美。 But when I deploy it (xcopy) to the web server it crashes and doesn't run: 但是,当我将它(xcopy)部署到Web服务器时,它崩溃了并且无法运行:

你调用的对象是空的。 System.Web.HttpApplication.ExecuteStep。 System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync

I've tried so far: Re-registering ASP.NET with IIS (aspnet_regiis.exe -i) for both x32 and x64 versions of .NET Deploying the application using VS 2010 Build deployment package command and then exporting this package into IIS. 到目前为止,我已经尝试过:为x32和x64版本的.NET向IIS(aspnet_regiis.exe -i)重新注册ASP.NET使用VS 2010 Build部署程序包命令部署应用程序,然后将此程序包导出到IIS。

Any thoughts? 有什么想法吗?

PS Other ASP.NET 4.0 applications (not MVC/Web API) are working just fine on the same server. PS其他ASP.NET 4.0应用程序(不是MVC / Web API)在同一服务器上也可以正常工作。

UPDATE: Part of my web.config (excluding connection strings and app settings) 更新:我的web.config的一部分(不包括连接字符串和应用程序设置)

<system.web>
<customErrors mode="Off"/>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="None" />
<pages>
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>
<profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager defaultProvider="DefaultRoleProvider">
  <providers>
    <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</roleManager>
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
  </providers>
</sessionState> </system.web>  



  <system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>  </system.webServer>


<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
</assemblyBinding>  </runtime>  

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />  </entityFramework>

I am 90% sure that the problem here is related to your custom message handlers. 我90%确信这里的问题与您的自定义消息处理程序有关。 I believe this is a bug but the team insisted that this was not. 我相信这是一个错误,但团队坚持认为并非如此。 Not sure how they will approach it. 不知道他们将如何处理。 Here is the drill: 这是演练:

If you create the response from scratch inside any of your message handlers, it doesn't carry the RequestMessage property by default obviously. 如果您在任何消息处理程序中从头开始创建响应,则默认情况下,它显然不带有RequestMessage属性。 So, it fails miserably with the famous "Object reference not set to an instance of an object." 因此,它因著名的“对象引用未设置为对象实例”而失败 error as soon as it's used. 使用后立即出错。 For example, the blow code, which sets the RequestMessage property of the HttpResponseMessage , solves the problem but I believe this should be done by the framework: 例如,用于设置HttpResponseMessageRequestMessage属性的打击代码可以解决此问题,但是我认为应该由框架来完成:

public class TerminatingMessageHandler : DelegatingHandler {

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, 
        CancellationToken cancellationToken) {

        var response = new HttpResponseMessage(HttpStatusCode.OK);
        response.RequestMessage = request;
        return Task.FromResult(response).ContinueWith(task => {

            var responseMsg = task.Result;

            var httpContext = responseMsg.RequestMessage.Properties["MS_HttpContext"] as HttpContextWrapper;
            if (httpContext != null)
                httpContext.Response.Headers.Remove("Server");

            return responseMsg;
        });
    }
}

Here is the bug report: http://aspnetwebstack.codeplex.com/workitem/408 If this is the case here for you, you may vote and leave a comment there if you want this to be fixed, too. 这里是错误报告: http : //aspnetwebstack.codeplex.com/workitem/408如果在这种情况下适合您,如果您也想解决此问题,可以投票并在此处发表评论。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM