请教一个关于web api 做单点登录时碰到的问题

ek88166 2015-08-04 11:21:59
我是做app后台开发的,app中有登录的功能,做法是在登录时前端传给我一个设备号,登录成功后在数据库中记录这个设备号,后面的每次接口请求前端都需要传用户id和设备号参数,我会写一个身份验证的筛选器(继承自AuthorizationFilterAttribute),在每次进入接口之前对其做验证。

现在碰到一个问题,好像是说request body只能够读取一次,证筛选器中自然是要读取一次做验证,
actionContext.Request.Content.ReadAsAsync<User>().Result
,在筛选器中我是这样读取的,
然后在通过验证后到达接口时发现参数为空,接收不到了。

[Route("UpdateUserInfo")]
public Response UpdateUserInfo(UpdateUserInfoModel model)
{
//执行到这里 model为null
}


我又尝试过在执行筛选器中代码时跳过读取request body的代码,
actionContext.Request.Content.ReadAsAsync<User>().Result
也就是这一句,结果是
[Route("UpdateUserInfo")]
public Response UpdateUserInfo(UpdateUserInfoModel model)
{
//代码再一次执行到这里时,model可以正常的获得参数
}

那么我怎么样才能在这2个地方都能够获取参数呢,请教各位大神!
我的分不多
...全文
247 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ek88166 2015-08-04
  • 打赏
  • 举报
回复
引用 3 楼 qwertxp 的回复:
你需要把请求继续向controler传递。

            base.OnAuthorization(actionContext);
这句有的
  • 打赏
  • 举报
回复
你为啥要这么读呢? 你可以通过var request = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request; 来获取参数,如果你是route传值的话,那你也可以通过RouteData来取值
qwertxp 2015-08-04
  • 打赏
  • 举报
回复
你需要把请求继续向controler传递。

            base.OnAuthorization(actionContext);
ek88166 2015-08-04
  • 打赏
  • 举报
回复
ek88166 2015-08-04
  • 打赏
  • 举报
回复
快来人
ek88166 2015-08-04
  • 打赏
  • 举报
回复
感谢回复, 结贴了
  • 打赏
  • 举报
回复
没研究过源代码,但这个问题估计和Request.Form及Request.BinaryRead不能同时使用类似
Request.form 提交的字符的,即是以文本形式传输 Request.BinaryRead 获取二进制数据流 而你在接收数据的时候只能任选其中一种,就是说,使用这两种不能混用。 但可以用Request.QueryString("参数")或者在BinaryRead 之前将参数 Requst参数传给变量 这两种办法做些变通。
ek88166 2015-08-04
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
你为啥要这么读呢? 你可以通过var request = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request; 来获取参数,如果你是route传值的话,那你也可以通过RouteData来取值
参数是json格式的,所以不能通过Form获取,只能通过输入流来获取了,
request.InputStream.Position = 0;
StreamReader sr = new StreamReader(request.InputStream);
string content = sr.ReadToEnd();
user = JsonConvert.DeserializeObject<User>(content);
按照你的方式,我把代码改成了这样, 这样的确可以
HttpContext.Current.Request.InputStream.Position = 0;
StreamReader sr = new StreamReader(HttpContext.Current.Request.InputStream);
string content = sr.ReadToEnd();
user = JsonConvert.DeserializeObject<User>(content);
这样也是可以的 虽然问题解决了,但是为啥呢 ?和之前的读取输入流的方式有啥不同 ? 刚接触web api不久,对很多还是不了解

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧