返回IHttpActionResult遇System.Web.HttpInputStream读取超时错误求助
问题分析与解决方案
首先看你遇到的错误:"Error getting value from 'ReadTimeout' on 'System.Web.HttpInputStream'.",这个问题的根源是你错误地将HttpResponseMessage对象作为内容传给了Content()方法。
为什么会触发这个错误?
Content(HttpStatusCode.OK, response)的作用是把传入的对象序列化成JSON/XML格式返回,但你传入的response是一个HttpResponseMessage实例——它内部包含了和当前请求绑定的流对象(比如Request.InputStream)。当序列化器尝试访问这个流的ReadTimeout属性时,这个流可能已经被释放或者无法读取了,所以抛出了这个异常。
你在global.aspx里配置的序列化规则(忽略循环引用、移除XML格式化器)是没问题的,毕竟其他API端点都能正常工作,问题完全出在这个Login方法的返回逻辑上。
修正后的代码
你不需要用Content()包装HttpResponseMessage,直接返回这个响应消息本身就可以了,Web API提供了专门的方法来处理这种场景:
public IHttpActionResult Login([FromBody]LoginVM login) { bool isAuthenticated = EmployeeSecurity.Login(login.quad, login.password); if (isAuthenticated) { var response = Request.CreateResponse(HttpStatusCode.OK, "Authorized"); response.Headers.Add("Token", "test"); response.Headers.Add("TokenExpiry", "testdate"); response.Headers.Add("Role", "testrol"); response.Headers.Add("Access-Control-Expose-Headers", "Token,TokenExpiry"); // 直接返回响应消息,而非用Content包装它 return ResponseMessage(response); } return Content(HttpStatusCode.Unauthorized, "Please check your QUAD or password."); }
补充说明
ResponseMessage()是Web API内置的方法,专门用来返回HttpResponseMessage类型的结果,它会正确处理你添加的自定义响应头和响应内容,不会触发序列化HttpResponseMessage本身的操作。- 你原来的写法相当于告诉Web API:“把这个响应消息对象转成JSON返回”,这显然不是你想要的——你真正需要的是返回这个响应消息本身,包含你设置的所有头信息和授权提示内容。
内容的提问来源于stack exchange,提问作者Aatish Kumar
相关产品推荐
相关产品推荐

