首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从OperationContract方法(WCF服务)返回图像

从OperationContract方法(WCF服务)返回图像
EN

Stack Overflow用户
提问于 2012-05-14 13:27:28
回答 3查看 11.6K关注 0票数 4

我正在尝试从WCF服务中获取一个Image

我有一个OperationContract函数,它向客户机返回一个Image,但是当我从客户机调用它时,我得到了这个异常:

套接字连接被中止。这可能是由于处理邮件时出错、远程主机超过接收超时或基础网络资源问题造成的。本地套接字超时时间是'00:00:59.9619978‘。

客户端:

代码语言:javascript
复制
private void btnNew_Click(object sender, EventArgs e)
{
    picBox.Picture = client.GetScreenShot();
}

Service.cs:

代码语言:javascript
复制
public Image GetScreenShot()
{
    Rectangle bounds = Screen.GetBounds(Point.Empty);
    using (Bitmap bmp = new Bitmap(bounds.Width,bounds.Height))
    {
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
        }
        using (MemoryStream ms = new MemoryStream())
        {
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return Image.FromStream(ms);
        }
    }
}

IScreenShot接口:

代码语言:javascript
复制
[ServiceContract]
public interface IScreenShot
{
    [OperationContract]
    System.Drawing.Image GetScreenShot();
}

那么为什么会发生这种情况,我该如何解决呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-15 20:50:24

我已经想明白了。

  • 首先使用TransferMode.StreamedStreamedResponse (取决于您的需要)。
  • 返回流,不要忘记设置Stream.Postion = 0,所以从一开始就开始读取流。

在服务中:

代码语言:javascript
复制
public Stream GetStream()
{
    Rectangle bounds = Screen.GetBounds(Point.Empty);
    using (Bitmap bmp = new Bitmap(bounds.Width, bounds.Height))
    {
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
        }
        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        ms.Position = 0;  // This is very important
        return ms;
    }
}

接口:

代码语言:javascript
复制
[ServiceContract]
public interface IScreenShot
{
    [OperationContract]
    Stream GetStream();
}

在客户端:

代码语言:javascript
复制
public partial class ScreenImage: Form
{
    ScreenShotClient client;
    public ScreenImage(string baseAddress)
    {
        InitializeComponent();
        NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
        binding.TransferMode = TransferMode.StreamedResponse;
        binding.MaxReceivedMessageSize = 1024 * 1024 * 2;
        client = new ScreenShotClient(binding, new EndpointAddress(baseAddress));
    }

    private void btnNew_Click(object sender, EventArgs e)
    {
        picBox.Image = Image.FromStream(client.GetStream());
    }
}
票数 7
EN

Stack Overflow用户

发布于 2012-05-14 13:45:25

您可以使用Stream返回大型数据/图像。

来自MSDN的示例示例(以流形式返回图像)

票数 3
EN

Stack Overflow用户

发布于 2012-05-14 13:39:33

您需要定义可序列化的东西。默认情况下,System.Drawing.Image是,但不是在WCF上下文中(使用DataContractSerializer)。这可能包括将原始字节作为数组返回,或者序列化到字符串(base64,JSON),或者实现可序列化的DataContract,并且可以随身携带数据。

正如其他人所说,WCF支持流,但这不是问题的症结所在。根据数据的大小,您可能希望这样做,这样做将减少问题本身,因为您将是流字节(从一个明显的,顶层视图)。

您还可以使用看看这个答案来帮助您获取实际的异常细节,比如完整的堆栈跟踪,而不仅仅是故障信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10584260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档