2016-11-07 8 views
1

WebAPIテンプレートを使用してASP.NET Coreアプリケーションを使用していて、既存のコントローラはすべてSystem.Web.Http.ApiControllerから継承されています。
したがって、要求は、方法ExecuteAsyncでNREを指すエラーで終了します。スタックこの例外のstaceを以下に示す:ASPコア:ApiController.ExecuteAsyncのNullReferenceException

System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    at lambda_method(Closure , Object , Object[]) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionFilterAsync>d__28.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.<Invoke>d__8.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext() 

興味深いモーメントIはオーバーライドExecuteAsync方法を発見した:controllerContext.ControllerDescriptorプロパティは空値(null)を有し、ExecuteAsyncの基本実装は、コード

ServicesContainer services = controllerContext.ControllerDescriptor.Configuration.Services; 
を実行しようとし、この例外をスロー

Controller state

私にとってもう一つのintersting瞬間は、デバッグログメッセージです:

Microsoft.AspNetCore.Mvc.Internal.ActionSelector: Debug: Action 'WebAPI.Controllers.AuthController.Post (WebAPI)' with id '9848905d-176e-44bc-9453-53c5185b46c6' did not match the constraint 

完全なデバッグメッセージスタックは以下の通りです:

Microsoft.AspNetCore.Hosting.Internal.WebHost: Information: Request starting HTTP/1.1 GET http://localhost:64513/api/auth application/json; charset=utf-8 0 
Microsoft.AspNetCore.Routing.Tree.TreeRouter: Debug: Request successfully matched the route with name '' and template 'api/auth'. 
Microsoft.AspNetCore.Mvc.Internal.ActionSelector: Debug: Action 'WebAPI.Controllers.AuthController.Post (WebAPI)' with id '9848905d-176e-44bc-9453-53c5185b46c6' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint' 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Debug: Executing action WebAPI.Controllers.AuthController.ExecuteAsync (WebAPI) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Information: Executing action method WebAPI.Controllers.AuthController.ExecuteAsync (WebAPI) with arguments (System.Web.Http.Controllers.HttpControllerContext, System.Threading.CancellationToken) - ModelState is Valid 
Exception thrown: 'System.NullReferenceException' in System.Web.Http.dll 
Exception thrown: 'System.NullReferenceException' in Microsoft.AspNetCore.Mvc.Core.dll 
Exception thrown: 'System.NullReferenceException' in mscorlib.dll 
Exception thrown: 'System.NullReferenceException' in mscorlib.dll 
Exception thrown: 'System.NullReferenceException' in mscorlib.dll 
Exception thrown: 'System.NullReferenceException' in mscorlib.dll 
Microsoft.AspNetCore.Server.Kestrel: Error: Connection id "0HL06UADGPFB4": An unhandled exception was thrown by the application. 

コントローラのアクションがAspNetCore.Mvc HTTPメソッド属性でマークされているが、それは前にアプリケーションのための問題ではありませんでした:私は

using BodyObject = Microsoft.AspNetCore.Mvc.FromBodyAttribute; 
using OPTIONS = Microsoft.AspNetCore.Mvc.HttpOptionsAttribute; 
using POST = Microsoft.AspNetCore.Mvc.HttpPostAttribute; 
[OPTIONS, POST] 
public async Task<PostResponse> Post([BodyObject] PostRequest model) 

問題の真の根本は何かを混乱させる。誰にもアイデアはありますか?

//コードの別のlineesが、私が思うに、問題をより良く理解するためにそこに示されなければならいくつか:

project.jsonの依存関係

"dependencies": { 
    "Microsoft.AspNet.WebApi.Core": "5.2.3", 
    "Microsoft.AspNetCore.Diagnostics": "1.0.0", 
    "Microsoft.AspNetCore.Mvc": "1.0.0", 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 
    "Microsoft.AspNetCore.Routing": "1.0.0" 
    }, 

Startup.RegisterServicesを

services.AddMvc(options => { /* some filters add code */ }); 
services.AddRouting(); 

スタートアップコンフィギュレーション

#if DEBUG 
loggerFactory.AddDebug((a, b) => true); 
#endif 
app.UseMvc(); 
app.UseCors(builder => builder.WithOrigins("*").AllowAnyHeader().AllowAnyMethod()); 

if (env.IsDevelopment()) 
{ 
    app.UseDeveloperExceptionPage(); 
} 
+1

あなたは 'Microsoft.AspNetCore.Mvc.Controller'から派生するか、WebApi compat shim(https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.WebApiCompatShim/1.0.0)を使用する必要があります。 WebApiパターンを使いたい。 'Microsoft.AspNet.WebApi.Core'はAsp.Netコアでの使用を意図していません。 – Pranav

答えて

1

Pranavお返事ありがとうございます。 何らかの理由で、MVC/WebAPIコントローラのアルファバージョンがよく混在していました。しかし人生は複雑なことであり、ControllerApiControllerの非互換性に関連する問題がありました。唯一の解決策は、AspCore.WebApiリレーションをすべて削除し、Microsoft.AspNetCore.Mvc.WebApiCompatShimパッケージをインストールすることでした。

関連する問題