You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:45