繁体   English   中英

WebAPI不在Asp.net MVC中返回带有状态码的错误消息

[英]WebAPI is not returning error message with statuscode in Asp.net mvc

我正在研究asp.net mvc webapi,它以json格式返回结果。 我正在尝试设置其中部分成功的Response.StatusCode 当我使用Postmanlocalhost上访问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);
    }
}

当我使用Postmanlocalhost上运行以上代码时,它会提供以下输出,这是预期的输出:

但是,当我尝试使用发布的链接进行尝试时,它显示在Postman中的Output下方:

没有手动设置的错误消息

我也尝试过下面的代码行,但是如果有try-catch块,它将不起作用。 如果我将这一行代码放入try-catch块中,则会出现错误:

声明之前无法使用局部变量“ Response”

Response.StatusCode = Convert.ToInt32(HttpStatusCode.Forbidden);
return Json(new { Response.StatusCode, Response = error }, JsonRequestBehavior.AllowGet);

您的错误消息清楚地表明,由于凭据无效,未经授权的访问被拒绝。 阅读本文,因为这可以清楚地说明。

https://support.microsoft.com/en-in/help/871179/you-receive-an-http-error-401-1-unauthorized-access-is-denied-due-to-i

发生这种情况是因为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);
    };
});

参考。 https://stackoverflow.com/a/47240601/1477388

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM