[英]WebAPI is not returning error message with statuscode in Asp.net mvc
我正在研究asp.net mvc
webapi,它以json
格式返回结果。 我正在尝试设置其中部分成功的Response.StatusCode
。 当我使用Postman
在localhost
上访问API时,它会返回状态代码和我手动设置的错误消息,但是当我使用已发布的链接访问API时,它仅返回StatusCode
。
public JsonResult Demo(string Fordate)
{
if (string.IsNullOrEmpty(Fordate))
{
errorMsg = "For Date is invalid, please correct";
ControllerContext.HttpContext.Response.StatusCode = Convert.ToInt32(HttpStatusCode.Unauthorized);
return Json(new { Response = errorMsg }, JsonRequestBehavior.AllowGet);
}
}
当我使用Postman
在localhost
上运行以上代码时,它会提供以下输出,这是预期的输出:
但是,当我尝试使用发布的链接进行尝试时,它显示在Postman
中的Output下方:
我也尝试过下面的代码行,但是如果有try-catch
块,它将不起作用。 如果我将这一行代码放入try-catch
块中,则会出现错误:
声明之前无法使用局部变量“ Response”
Response.StatusCode = Convert.ToInt32(HttpStatusCode.Forbidden);
return Json(new { Response.StatusCode, Response = error }, JsonRequestBehavior.AllowGet);
您的错误消息清楚地表明,由于凭据无效,未经授权的访问被拒绝。 阅读本文,因为这可以清楚地说明。
发生这种情况是因为401错误是服务器错误。 因此,请求永远不会到达您的GET
操作。
您的控制器是否具有[Authorize]
属性? 如果是这样,您可以按此处所述用自定义属性 (推荐)替换它,也可以删除它并让您的操作处理它(不推荐):
throw new HttpResponseException(HttpStatusCode.Unauthorized);
如果使用的是.NET Core,则更好的解决方案可能是像这样配置Startup.cs类(您可能需要根据自己的喜好配置):
services.AddIdentity<User, IdentityRole>(options =>
{
options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = ctx =>
{
if (ctx.Request.Path.StartsWithSegments("/api") &&
ctx.Response.StatusCode == (int) HttpStatusCode.OK)
{
ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
}
else
{
ctx.Response.Redirect(ctx.RedirectUri);
}
return Task.FromResult(0);
}
};
});
参考。 https://devblog.dymel.pl/2016/07/07/return-401-unauthorized-from-asp-net-core-api/
在更高版本的.NET Core(和标识)中,您可能想要使用类似的内容(同样,您将需要自定义此内容以满足您的要求):
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = new PathString("/Account/Login");
options.LogoutPath = new PathString("/Account/Logout");
options.Events.OnRedirectToLogin = context =>
{
if (context.Request.Path.StartsWithSegments("/api")
&& context.Response.StatusCode == StatusCodes.Status200OK)
{
context.Response.Clear();
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
return Task.FromResult<object>(null);
}
context.Response.Redirect(context.RedirectUri);
return Task.FromResult<object>(null);
};
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.