【问题标题】:Web api controller method giving exception while serializing the Stream objectWeb api 控制器方法在序列化 Stream 对象时给出异常
【发布时间】:2012-10-03 12:28:14
【问题描述】:

我有一个web api控制器方法如下:

[HttpPost]
public string PostMethod(int id)
{
  Stream downloadStream = Service.downloadStream(id);  
  JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
  string output  = jsonSerializer.Serialize(downloadStream);
}

我从 java applet 调用这个方法,url 为:

http://localhost1/api/PostMethod/1

我在第 3 行得到一个异常:

"此流不支持超时,'ObjectContent`1' type 未能序列化内容类型“application/json”的响应正文; charset=utf-8'。”

对此有什么可能的解决方案?如何通过 Webapi 控制器方法将流作为 JSON 对象发送?

【问题讨论】:

    标签: .net json asp.net-mvc-3 stream asp.net-web-api


    【解决方案1】:

    Web Api 支持内容协商,不需要序列化对象直接返回即可。

    Web Api 会根据客户端的要求自动返回 XML 或 Json 给客户端

    content-type: application/json
    

    Web 浏览器通常会获取 XML,而作为 javascript Json。您的 java 小程序只需要上面的标头(实际上看起来可能已经发送)。

    [HttpPost]
    public string PostMethod(int id)
    {
       Stream downloadStream = Service.downloadStream(id);  
       System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
       downloadStream.CopyTo(memoryStream);
       return memoryStream.ToString();
    }
    

    这在很大程度上取决于 downloadStream 方法返回的内容;

    【讨论】:

    • 好的,但我从提琴手测试过。我收到了异常,因为 downloadStream.ReadTimeout' 抛出了“System.InvalidOperationException”类型的异常和内部异常“,“ObjectContent`1”类型无法序列化内容类型“application/json; charset=utf-8”的响应正文'" 。我担心的是为什么流对象没有被序列化?有没有办法避免 ReadTimeout 异常?
    • 流是打开的文件或网络连接,序列化没有意义。它的内容是的,但流本身没有。
    • 谢谢,有什么办法可以避免 ReadTimeout 异常?还有一件事,那么我将如何返回流对象?public stream PostMethod(int id) { return stream ;} 无论如何都会给我异常
    • service.downloadstream 到底是做什么的?
    • 我将文件存储在 SQL Server 的流中。因此,service.downloadstream 将该流返回到小程序以供使用。我唯一的问题是小程序收到 500 内部错误提示“对象无法序列化”。任何替代方案或解决方案?
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2016-09-16
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多