none
WCF对Stream的操作问题:WCF服务可以传输Stream对象的集合吗?如List<Stream> RRS feed

  • 问题

  • 服务端代码:
      契约方法: ServiceResult GetFiles(ServiceRequest result);
      自定义数据类型 :
      [MessageContract]
      public Class ServiceRequest{
      [MessageHeader]
      public string FileName{get;set;}
      [MessageBodyMember]
      public List<SendFileInfo> SendFileInfos{get;set;}
      }

    [MessageContract]
      public Class SendFileInfo{
      [MessageHeader]
      public string SendFileName{get;set;}  [MessageBodyMember]
      public Stream SendFileStream{get;set;}
      }

    服务端代码:
      契约方法: ServiceResult GetFiles(ServiceRequest result);
      自定义数据类型 :
      [MessageContract]
      public Class ServiceRequest{
        [MessageHeader]
        public string FileName{get;set;}
        [MessageBodyMember]
        public List<SendFileInfo> SendFileInfos{get;set;}
      }

      [MessageContract]
      public Class SendFileInfo{
        [MessageHeader]
        public string SendFileName{get;set;}
        [MessageHeader]
        public long SendFileSize{get;set;}
        [MessageBodyMember]
        public Stream SendFileStream{get;set;}
      }

      [MessageContract]
      public Class ServiceResult {
        [MessageHeader]
        public string FileName{get;set;}
        [MessageBodyMember]
        public Stream FileByteStreams{get;set;}
      }

    在客户端调用GetFiles方法时抛出CommunicationException异常,
    而且在服务器端的log日志也没有输出。

    当我把public List<SendFileInfo> SendFileInfos{get;set;}改为public Stream SendFileInfos{get;set;}时就可以测试

    通过。
    这是为什么呢,是不是WCF不支持List<Stream> 这种数据的传输啊?

    2012年3月21日 9:49

答案

  • 我猜测是可以的,只是你的消息契约定义有问题。

      [MessageContract]
      public Class ServiceRequest{
        [MessageHeader]
        public string FileName{get;set;}
        [MessageBodyMember]
        public List<SendFileInfo> SendFileInfos{get;set;}
      }

      [MessageContract]
      public Class SendFileInfo{
        [MessageHeader]
        public string SendFileName{get;set;}
        [MessageHeader]
        public long SendFileSize{get;set;}
        [MessageBodyMember]
        public Stream SendFileStream{get;set;}
      }

    一个消息契约不能作为一个消息契约的内部元素吧,这个会导致消息构造错误。你把SendFileInfo定义成普通的Datacontract试试


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2012年3月22日 9:01
    版主

全部回复

  • 我猜测是可以的,只是你的消息契约定义有问题。

      [MessageContract]
      public Class ServiceRequest{
        [MessageHeader]
        public string FileName{get;set;}
        [MessageBodyMember]
        public List<SendFileInfo> SendFileInfos{get;set;}
      }

      [MessageContract]
      public Class SendFileInfo{
        [MessageHeader]
        public string SendFileName{get;set;}
        [MessageHeader]
        public long SendFileSize{get;set;}
        [MessageBodyMember]
        public Stream SendFileStream{get;set;}
      }

    一个消息契约不能作为一个消息契约的内部元素吧,这个会导致消息构造错误。你把SendFileInfo定义成普通的Datacontract试试


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2012年3月22日 9:01
    版主
  • Stream不能像您来操作,给您几个类型(微软的)

    Microsoft.Http.Extensions.dll

    Microsoft.Http.dll


    认真学习,不耻下问.^_^

    2012年3月24日 13:24