2

Visual Studio 2010 で実行すると正常に動作する ASP.NET Web API アプリを開発しています。しかし、Web サーバーにデプロイ (xcopy) すると、クラッシュして実行されません。

オブジェクト参照がオブジェクト インスタンスに設定されていません。 System.Web.HttpApplication.ExecuteStep.  System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync

私はこれまでに試しました: .NET の x32 バージョンと x64 バージョンの両方について、ASP.NET を IIS (aspnet_regiis.exe -i) に再登録する VS 2010 Build deployment package コマンドを使用してアプリケーションをデプロイし、このパッケージを IIS にエクスポートします。

何かご意見は?

PS 他の ASP.NET 4.0 アプリケーション (MVC/Web API ではない) は、同じサーバー上で問題なく動作しています。

更新: 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>
4

1 に答える 1

0

ここの問題がカスタム メッセージ ハンドラに関連していることは 90% 確信しています。これはバグだと思いますが、チームはそうではないと主張しました。彼らがそれにどのようにアプローチするかはわかりません。ここにドリルがあります:

いずれかのメッセージ ハンドラー内で最初から応答を作成する場合、RequestMessage明らかに既定ではプロパティを保持しません。そのため、有名な「オブジェクト参照がオブジェクトのインスタンスに設定されていません」で惨めに失敗します。使ってすぐエラー。たとえば、 のRequestMessageプロパティを設定するブロー コードHttpResponseMessageは問題を解決しますが、これはフレームワークで行う必要があると思います。

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;
        });
    }
}

バグ レポートは次のとおりです。http://aspnetwebstack.codeplex.com/workitem/408これが当てはまる場合は、投票してコメントを残してください。これも修正する必要があります。

于 2012-11-14T14:38:23.613 に答える