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
少なくとも行番号を確認できるようにPDBを公開してください。私はあなたのDIが働いていないと思う。 – leppie
私のビジュアルスタジオがデフォルト構成を持っている場合、どこでPDBを見つけることができますか?あなたはDependency Injectionを意味しますか?私はNInjectについて同じ感情を持っていますが、なぜそれがデバッグだけで動作するのか分かりません –