Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebAPI在Asp.net mvc中未返回状态代码为的错误消息_C#_Asp.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

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);
    };
});