【发布时间】:2016-03-29 16:32:17
【问题描述】:
我有一个在 Visual Studio 2015 调试器上完美运行的 API 应用程序;我正在尝试在 IIS 上发布我的应用程序(我已通过控制面板打开/关闭 Windows 功能安装了服务器)。
我的应用程序有一个安全系统来检查任何请求是否来自注册用户,任何请求通过首先抛出ApiAuthorizationFilter,解析由Base64字符串组成的令牌,它作为Authorization 并使用 JSON 返回特定的 HttpStatusCode。
部署后发生异常,如果我在 IIS 上的应用程序上运行测试会在 Filter.ApiAuthorizationFilter 处抛出 NullReferenceException,但如果我在 Visual Studio 上运行相同的应用程序 - 它可以工作。
这是错误信息:
500:内部服务器错误 “消息”:“发生错误。” “ExceptionMessage”:“对象引用未设置为对象的实例。” “异常类型”:“System.NullReferenceException” "StackTrace": " at API.CARDS.Models.Filter.ApiAuthorizationFilter.OnAuthorization(HttpActionContext actionContext) at System.Web.Http.Filters.AuthorizationFilterAttribute.OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancelToken) --- 来自先前位置的堆栈跟踪结束抛出异常的地方---在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext( ) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) .Http.Dispatcher.HttpControllerDispatcher.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));
}
}
}
【问题讨论】:
-
发布 PDB,这样您至少可以看到行号。我怀疑你的 DI 不工作。
-
如果我的 Visual Studio 具有默认配置,我在哪里可以找到 PDB?你的意思是依赖注入吗?我对 NInject 也有同样的感觉,但我不知道为什么它只在 Debug 上有效