2016-03-29 7 views
1

IIS上で自分のアプリケーションを公開しようとしています(私はコントロールパネルのWindows機能をオン/オフでサーバーをインストールしました)。Visual Studio 2015デバッガで完璧に動作するAPIアプリケーションがありますが、IISでNInjectが動作しないAPIアプリケーションは、デバッガVisual Studioでのみ動作します。

私のアプリケーションは、すべての要求が登録されたユーザからのものであることを確認し、すべての要求が最初のスローApiAuthorizationFilterを渡し、Base64文字列で構成されたトークンを解決するために、セキュリティシステムを持って、それが認証としてヘッダに来て、返します特定のHttpStatusCodeとJSON

例外が発生しました。IISのアプリケーションでテストを実行すると、がFilter.ApiAuthorizationFilterにスローされますが、Visual Studioで同じアプリケーションを実行すると動作します。

これはエラーメッセージです:

500:内部サーバーエラー "メッセージ": "エラーが発生しました" "ExceptionMessage": "オブジェクト参照がオブジェクトのインスタンスに設定されていません。 "ExceptionType": "System.NullReferenceException" "のStackTrace": "System.Web.Http.Filters.AuthorizationFilterAttribute.OnAuthorizationAsyncでAPI.CARDS.Models.Filter.ApiAuthorizationFilter.OnAuthorization(HttpActionContextするactionContext)(AT HttpActionContextするactionContext、CancellationToken cancellationToken )---例外がスローされた前の場所からのスタックトレースの終了--- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at System.Web .Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext()---例外がスローされた前の場所からのスタックトレースの終了--- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)(System.Runtime.CompilerServices)。 System.Web.Http.Dispatcher.HttpControllerDispaのTaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク) tcher.d__1.MoveNext()」

ここではコードです:

ApiAuthorizationFilter

public class ApiAuthorizationFilter : AuthorizationFilterAttribute 
{ 
    [Inject] 
    public IEncryptionSystemService service { get; set; } 

    [Inject] 
    public IUserService userService { get; set; } 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     //Hace una petición (request) al actionContext 
     HttpRequestMessage request = actionContext.Request; 
     try 
     { 
      //Establece la cultura (Ejemplo: es-MX) para los mensajes i18n 
      string culture = actionContext.Request.Headers.AcceptLanguage.ToString(); 
      if (culture.Length == 5) 
      { 
       Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); 
       Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture); 
      } 
      //Crea un token con los valores que se obtienen del actionContext, mismos que serán las credenciales para accesar. 
      string token = actionContext.Request.Headers.GetValues("Authorization").FirstOrDefault().Replace("Credentials", "").Trim(); 
      //Desencripta las credenciales con el servicio del tipo IEncryptionService. 
      string[] userPass = service.DecryptText(token); 
      User model = new User { email = userPass[0], password = userPass[1] }; 
      ////Verifica que sean correctas las credenciales que ser obtuvieron del token. 
      AuthorizationResult result = userService.LoginUser(model); 
      switch (result) 
      { 
       case AuthorizationResult.ACCESS_GRANTED: 
        User user = new User { email = model.email }; 
        ApiIdentity identity = new ApiIdentity(user); 
        ApiPrincipal principal = new ApiPrincipal(identity); 
        Thread.CurrentPrincipal = principal; 
        break; 
       case AuthorizationResult.ACCESS_DENIED: 
        actionContext.Response = request.CreateResponse(HttpStatusCode.NotFound, "ErrorResources.NotFound"); 
        break; 
       case AuthorizationResult.PERMISSION_DENIED: 
        actionContext.Response = request.CreateResponse(HttpStatusCode.Unauthorized, "ErrorResources.Unauthorized"); 
        break; 
      } 
     } 
     catch (Exception e) 
     { 
      throw; 
      //Si existe un error durante la petición, regresa un estatus de InternalServerError (Error interno del Servidor). 
      //actionContext.Response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, string.Format("ErrorResources.AuthenticationError ---- {0}",e.Message)); 

     } 
    } 
} 

Image response from the debugger

Image response from IIS

+0

少なくとも行番号を確認できるようにPDBを公開してください。私はあなたのDIが働いていないと思う。 – leppie

+0

私のビジュアルスタジオがデフォルト構成を持っている場合、どこでPDBを見つけることができますか?あなたはDependency Injectionを意味しますか?私はNInjectについて同じ感情を持っていますが、なぜそれがデバッグだけで動作するのか分かりません –

答えて

2

私は大きな後に答えを見つけましたが、研究!、これは、 rはAPIアプリケーションのNInject、です。Leppie氏の問題は、Dependency Injection Configurationです。

まず、私はNuGetからインストール私のパケットをきれいにしなければならなかった、私はこれらのパケットをNinjectを再インストールする必要がありました。

  • Ninject
  • Ninject.web.WebApi
  • Ninject.web.WebApi.WebHost - 私はこの1つが欠けた、これは、IISのサポート
  • Ninjectのために必要です。MVC3
  • Ninject.web.Common
  • Ninject.web.Common.WebHost - 、これはそのチェックした後、IISのサポート

ために必要なを最後のバージョン(3.2.3)にこの1を更新CreateKernel(と呼ばれる方法)であなたのクラスNInjectWebCommon.csは、私はあなたがTHIので、それを削除する必要が

GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 

このラインを持っていましたSはすべてがOKであればNinjectDefaultModelValidatorProvider

に ModelValidatorProviderからバインディングを使用ModelValidatorProviderを活性化

エラーがスローされます!アプリケーションはIISサーバーで実行されます。

これらのファイルはApp_Startフォルダに

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 

      // GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     // kernel.BindFilter<ApiAuthorizationFilter>(FilterScope.Controller, 0).WhenControllerHas<ApiAuthorizationFilter>(); 

     NInjectHelper.SetupKernel(kernel); 
     kernel.Bind<IEncryptionSystemService>().To<EncryptionSystemService>(); 
     kernel.Bind<IUserService>().To<UserService>(); 
     kernel.Bind<IRoleService>().To<RoleService>(); 
     kernel.Bind<IStatusService>().To<StatusService>(); 
     kernel.Bind<ICardService>().To<CardService>(); 
     kernel.Bind<ICardTypeService>().To<CardTypeService>(); 


    } 

} 

NinjectResolver.cs

NinjectWebCommon.cs NInjectの私の最後の構成されている

public class NinjectResolver : NinjectScope, IDependencyResolver 
{ 
    private IKernel _kernel; 

    public NinjectResolver(IKernel kernel) 
     : base(kernel) 
    { 
     _kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectScope(_kernel.BeginBlock()); 
    } 
} 

NinjectScope.cs

public class NinjectScope : IDependencyScope 
{ 
    protected IResolutionRoot resolutionRoot; 

    public NinjectScope(IResolutionRoot kernel) 
    { 
     resolutionRoot = kernel; 
    } 

    public object GetService(Type serviceType) 
    { 
     IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
     return resolutionRoot.Resolve(request).SingleOrDefault(); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
     return resolutionRoot.Resolve(request).ToList(); 
    } 

    public void Dispose() 
    { 
     IDisposable disposable = (IDisposable)resolutionRoot; 
     if (disposable != null) disposable.Dispose(); 
     resolutionRoot = null; 
    } 
} 

重要! SQL Serverのユーザー あなたは私のApiFilterConfiguration上で見ることができるように、私はこの行AuthorizationResult result = userService.LoginUser(model); を持っているために、このUserServiceのは、私は、このメソッドは要求からモデルを取得する方法LoginUser(モデル)で作成したクラスです。ヘッダーSQLサーバーに移動して、ユーザーが存在することを確認します。

あなたは私とデフォルトの設定SQL Serverのをインストールした場合は、多分あなたは、ご相談null参照をスローする別の問題があるかもしれないあなたはIISのログインを作成する必要がLogin failed for user IIS APPPOOL\AppPool4.5 or APPPOOL\ASP.NETこのトピックをチェックあなたのSQLSERVER

関連する問題