首页 新闻 会员 周边 捐助

webapi response.redirect 引发的异常

0
悬赏园豆:10 [已解决问题] 解决于 2015-10-13 15:14

大致说明一下,在controller上加了个简单的权限验证,如果权限不够,就跳转到其它url,但部分手机访问时会报如下错误,大致代码如下:

权限验证代码:

 public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
                HttpContext.Current.Response.Redirect("~/api/Login/QM_Users/NotLogin", true);
                return false;       
        }
    }

调用权限验证代码

异常详情:

老牛在路上的主页 老牛在路上 | 初学一级 | 园豆:11
提问于:2015-10-13 10:04
< >
分享
最佳答案
0

API在未授权的时候返回的应该是401等未授权Code,  Redirect是前端页面的做法.

收获园豆:10
DukeCheng | 菜鸟二级 |园豆:220 | 2015-10-13 10:36

就好像你调用微信的接口一样,权限不够,并不会返回401,只会提示例如下面这样的消息{"Success":false,"ErrCode":1,"ErrMsg":"invalid code"}

老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 13:28

@老牛在路上: 返回的设计上有两种方式, 

1. 封包

2. 不封包,你上面贴出的是封包的方式, 

这两种方式有一个明显的区别,就是是否含有success的属性, 

封包: 每个消息返回的HttpCode都是200, 里面有Success标记是否成功,Message说明一些特别情况

不封包: 每个消息根据HttpCode确定返回是成功还是失败, 成功的时候按正常的解析,不成功的时候根据状态码解析错误信息.

DukeCheng | 园豆:220 (菜鸟二级) | 2015-10-13 13:34

@Flyear: 对,我就是在attrubite封装了,但好像 我用redirect就有问题了。

老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 13:46

@老牛在路上: 在验证失败的时候,返回302做ReLocation本身就是不符合常规的做法,除非你有明确这个地址是要做302。

DukeCheng | 园豆:220 (菜鸟二级) | 2015-10-13 13:47

@Flyear: 嗯,那如果我想封包,不用跳转的话应该怎么做

老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 14:05

@老牛在路上: 那就在封包里面加各ErrorCode, ErrorMessage, 客户端根据Code去判断要跳转到哪里.

DukeCheng | 园豆:220 (菜鸟二级) | 2015-10-13 14:06

@Flyear: 嗯,我的本意就是这样,我本来的思路是在attribute的IsAuthorized里做判断,然后把所有controller都加上这个特性,这样所有地址都会进行权限判断了,但我不知道在IsAuthorized应该怎么返回,所以才用了redirect

老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 14:17

@Flyear:找到了HandleUnauthorizedRequest,应该可以了,谢谢各位。

老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 15:13
其他回答(2)
1

API返回302是什么意思?

吴瑞祥 | 园豆:29449 (高人七级) | 2015-10-13 10:21

你会返回302?

支持(0) 反对(0) 老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 13:24

@老牛在路上: 下面顾小北的说法是对的.

像这种接口你要定义一个约定.所有的api返回值都继承自result基类.

基类中包含错误信息,你在过滤器直接返回结果就可以了.webapi中是可以的.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-10-13 15:15
0

既然是WebAPI,为什么要Redirect?

顾晓北 | 园豆:10898 (专家六级) | 2015-10-13 11:05

其实就是一个简单处理,判断不够权限就返回例如下面这样的消息{"Success":false,"ErrCode":1,"ErrMsg":"NotLogin"}

支持(0) 反对(0) 老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 13:25

@老牛在路上: 那就返回就完了,为什么要跳转?直接return Json(new {"Success":false,"ErrCode":1,"ErrMsg":"NotLogin"});就行了。。。

 

这既然是API,你也不确定你的客户端是不是浏览器,你也不确定客户端调用是不是Ajax,你这个跳转是发送给客户端一个302的消息,你的客户端就确定可以处理302?

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2015-10-13 13:31

@顾晓北: 和你说的其实是一样的,只是由于我是在attribute里做的判断,所以不知道怎么直接return,  所以redirect跳转后的action里是一个 return new HttpResponseMessage {内容}

支持(0) 反对(0) 老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 13:44

@老牛在路上: 

JsonResult result = new JsonResult();
                    result.Data = new { State = "100", ErrorCode = "001", ErrorMessage = "MD5校验失败", Message = "验证失败" };
                    result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                    filterContext.Result = result;
                    return;

这样试试呢?

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2015-10-13 13:49

@顾晓北: 谢谢,你这样在mvc里应该是可以的,但在webapi的attribute里好像不行,我看有没有别的办法。

支持(0) 反对(0) 老牛在路上 | 园豆:11 (初学一级) | 2015-10-13 14:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册