使用REST为图像提供复杂对象

时间:2012-04-11 15:57:32

标签: c# wcf rest

Noob WCF / REST问题在这里!
我需要构建一个简单的Web服务(现在是一种方法),我的偏好是REST / JSON类型的体系结构,但我不确定这可以在我的情况下实现。

我知道在使用基于REST的服务时,将复杂对象序列化/反序列化为JSON很容易。虽然我还没有测试过它,但REST-based service to return an image看起来也很容易。

但是,我的情景可能需要兼顾两者。下面是可以返回的对象定义的示例:

class Response
{
  string myTitle;
  string myDate;
  Object myImage; 
}

我意识到我可以将物理图像存储在任何可访问的位置,然后只需将URL作为字符串返回,但我希望尽可能避免开销。

甚至可能吗?

另请注意,我并没有以任何方式致力于REST或JSON,只是所有酷孩子都在使用它......

1 个答案:

答案 0 :(得分:0)

如果您希望图像作为JSON对象的一部分,请将其转换为可序列化类型。最简单的方法就是使用它的字节表示。

System.Drawing.Image img = System.Drawing.Image.FromFile("filename");
byte[] imgContent;
using (System.IO.MemoryStream m = new System.IO.MemoryStream())
{
    img.Save(m, img.RawFormat);
    imgContent = new byte[m.Length];
    const int count = 4096;
    byte[] buffer = new byte[4096];
    for (int i = 0; i < m.Length; i += count)
    {
        m.Read(buffer, i, (m.Length - i < count ? (int)(m.Length - i) : count));
        buffer.CopyTo(imgContent, i);
    }
}
myResponse.myImage = imgContent;

编辑:正如OP发现的那样,有一种更简单/更快捷的写作方式:

System.Drawing.Image img = System.Drawing.Image.FromFile("filename");
using (System.IO.MemoryStream m = new System.IO.MemoryStream())
{
    img.Save(m, img.RawFormat);
    myResponse.myImage = m.ToArray();
}