【问题标题】:Webapi returns html page instead of jsonWebapi 返回 html 页面而不是 json
【发布时间】:2018-12-07 02:55:19
【问题描述】:

我已经为令牌验证实现了一个动作过滤器属性,如果令牌无效,那么 api 响应应该从这个动作过滤器返回。

    public class TokenValidationAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                 bool isValidToken = FunctionToVerifyToken();
                 if (!isValidToken ))
                        {

                            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
                            {
                                Content = new StringContent("Unauthorized user")
                            };
                            return;
                        }
               }
       }

回应: 它转到 _layout.cshtml 并返回整个 html 页面,而不仅仅是返回“未经授权的用户”

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Sign in</title>
        <link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />
        <link href="/Content/styles.css" rel="stylesheet"/>
        <script src="/Scripts/modernizr-2.8.3.js"></script>
        ...

更新: 我使用此令牌的控制器:

public class ServiceController : ApiController
    {
         [AcceptVerbs("GET", "POST")]
        [HttpGet]
        [HttpPost]
        [TokenValidation]
        public object ChangePassword()
        {
            //my logic is token is valid. It returns json data and works fine.
        }
}

返回的视图是登录页面。

我的WebApiConfig.cs

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{action}/{id}",
                defaults: new { controller = "Service", id = RouteParameter.Optional },
                constraints: null
            );

        }
}

【问题讨论】:

  • 整个 HTML 页面是什么样子的?它返回什么部分/视图?另外请在您使用此TokenValidationAttribute 的地方添加一个控制器/操作,这可能会有所帮助。
  • 请查看更新后的问题。
  • 您是否在控制器级别或您的FunctionToVerifyToken() 所在的任何位置使用了[Authorize] 属性?
  • 尝试格式化字符串内容为:StringContent(Json.Encode(new { message = "Unauthorized user" }), Encoding.UTF8, "application/json");
  • [Authorize] 属性未在 webapi 中的任何地方使用,我已将字符串内容格式化为 StringContent(Json.Encode(new { message = "Unauthorized user" }), Encoding.UTF8, "application/json") 但仍返回整个 html 页面。

标签: asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

在 Global.ascx.cs 中添加以下行

  • GlobalConfiguration.Configure(FilterConfig.Register);

在FilterConfig.cs中注册方法

    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new TokenValidationAttribute());
    }

【讨论】:

    【解决方案2】:

    我认为您的代码在 TokenValidationAttribute.cs 操作过滤器中缺少以下行。 base.OnActionExecuting(actionContext); return; 这会得到你的格式化结果并显示你的结果,而不是显示视图。

    【讨论】:

      【解决方案3】:

      我返回响应为:

      actionContext.Response = actionContext.Request.CreateResponse<string>(HttpStatusCode.BadRequest, "Unauthorized user");
      

      它返回 "Unauthorized user" 而不是整个 html 页面。

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多