Ich habe eine API-Anwendung, die perfekt auf Visual Studio 2015 Debugger funktioniert; Ich versuche, meine Anwendung auf IIS zu veröffentlichen (Ich habe den Server über Systemsteuerung installiert Windows-Funktionen ein-/ausschalten).API App mit NInject funktioniert nicht auf IIS, es funktioniert nur auf Debugger Visual Studio
Meine Anwendung ein Sicherheitssystem muss zu überprüfen, dass jede Anforderung von einem Benutzer registriert ist, jede Anfrage ApiAuthorizationFilter
ersten Wurf passiert, lösen Sie das Token, das durch Base64-String zusammengesetzt ist, kommt es im Header als Authorization und gibt die spezifische HttpStatusCode
mit JSON.
Die Ausnahme tritt nach Bereitstellung, wenn ich einen Test für die Anwendung ausführen, die IIS wirft NullReferenceException
um Filter.ApiAuthorizationFilter
, aber wenn ich die gleiche Anwendung auf Visual Studio ausführen - es funktioniert.
Dies ist die Fehlermeldung:
500: Interner Serverfehler "Message": "Ein Fehler ist aufgetreten" "ExceptionMessage": "Objektverweis nicht auf eine Instanz eines Objekts festgelegt." "Exception": "System.NullReferenceException" "Stacktrace": "in API.CARDS.Models.Filter.ApiAuthorizationFilter.OnAuthorization (HttpActionContext Action) bei System.Web.Http.Filters.AuthorizationFilterAttribute.OnAuthorizationAsync (HttpActionContext Action, CancellationToken CancellationToken) --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) unter System.Web .Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) unter System.Runtime.CompilerServices. TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) unter System.Web.Http.Dispatcher.HttpControllerDispa tcher.d__1.MoveNext()“
Hier ist der Code:
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
Veröffentlichen Sie die PDBs, so dass Sie zumindest die Zeilennummer sehen können. Ich vermute, dass deine DI nicht funktioniert. – leppie
Wo kann ich die PDBs finden, wenn mein Visual Studio die Standardkonfiguration hat? und meinst du die Dependency Injection? Ich habe das gleiche Gefühl über das NInject, aber ich weiß nicht, warum es nur auf Debug funktioniert –