C# WebAPI在Asp.net mvc中未返回状态代码为的错误消息
我正在开发C# WebAPI在Asp.net mvc中未返回状态代码为的错误消息,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我正在开发asp.netmvcwebapi,它以json格式返回结果。我正在尝试设置我部分成功的Response.StatusCode。当我使用Postman点击localhost上的API时,它返回我手动设置的状态代码和错误消息,但当我使用发布的链接点击API时,它只返回StatusCode public JsonResult Demo(string Fordate) { if (string.IsNullOrEmpty(Fordate)) { errorMs
asp.netmvc
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);
}
}
当我在localhost
上使用Postman
运行上述代码时,它会给出以下预期输出:
但当我用我发布的链接尝试它时,它显示在邮递员的输出下面:
我也尝试了以下代码行,但如果有try-catch
块,它就不起作用。如果我将这行代码放入try catch
块,则会出现错误:
无法在声明局部变量“Response”之前使用它
这是因为401错误是服务器错误。因此,请求永远不会到达您的GET
操作
您的控制器是否具有[Authorize]
属性?如果是这样,您可以按此处所述将其替换为(推荐的),或者只需将其删除,然后让您的操作处理它(不推荐):
如果您使用的是.NET Core,更好的解决方案可能是这样配置Startup.cs类(您可能需要根据自己的喜好进行配置):
services.AddIdentity(选项=>
{
options.Cookies.applicationcokie.Events=新的CookieAuthenticationEvents
{
OnRedirectToLogin=ctx=>
{
if(ctx.Request.Path.StartsWithSegments(“/api”)&&
ctx.Response.StatusCode==(int)HttpStatusCode.OK)
{
ctx.Response.StatusCode=(int)HttpStatusCode.Unauthorized;
}
其他的
{
响应重定向(ctx.RedirectUri);
}
返回Task.FromResult(0);
}
};
});
参考文献
在.NET Core(和Identity)的更高版本中,您可能希望使用类似于以下内容的内容(同样,您希望自定义此内容以满足您的需求):
services.configureApplicationOK(选项=>
{
options.LoginPath=新路径字符串(“/Account/Login”);
options.LogoutPath=新路径字符串(“/Account/Logout”);
options.Events.OnRedirectToLogin=上下文=>
{
if(context.Request.Path.StartsWithSegments(“/api”)
&&context.Response.StatusCode==StatusCodes.Status200OK)
{
context.Response.Clear();
context.Response.StatusCode=StatusCodes.status401未授权;
返回Task.FromResult(空);
}
context.Response.Redirect(context.RedirectUri);
返回Task.FromResult(空);
};
});
参考。您的错误消息明确指出,由于凭据无效,未经授权的访问被拒绝。阅读这篇文章,因为它解释得很清楚
从您共享的图像中,由于未经授权的用户,您的调用永远不会到达您的方法。您是否也使用该API调用发送令牌?当前我没有使用API调用发送任何令牌您是否使用基于令牌的身份验证?不,我没有使用基于令牌的身份验证。我的控制器没有[授权]属性,并且我没有使用.NET Core。如何显示我正在使用这些状态代码手动设置的错误消息,因为我必须同时使用状态代码显示错误消息。您使用的是.NET、MVC和Identity的哪些版本?您可以在解决方案资源管理器下解决方案的“参考”文件夹中找到这些答案。右键单击每个依赖项并选择“属性”以查找版本。谢谢,但我想显示带有状态码的自定义错误消息。
Response.StatusCode = Convert.ToInt32(HttpStatusCode.Forbidden);
return Json(new { Response.StatusCode, Response = error }, JsonRequestBehavior.AllowGet);
throw new HttpResponseException(HttpStatusCode.Unauthorized);
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);
}
};
});
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);
};
});