WCF - 返回自定义列表

时间:2012-07-09 13:48:02

标签: wcf

我正在使用WCF并尝试将对象的列表(或数组)返回给我的客户端。 它似乎适用于标准类型,我可以返回自定义对象,但不返回自定义对象列表(即使列表中只有一个项目)。

我已经阅读了相关主题的相当数量,但似乎无法随意使用它。 它正在编译好,但在客户端,当我到达我的函数时,客户端抛出异常

  

“接收HTTP响应时发生错误。这可能是应该的   不使用HTTP协议的服务端点绑定。这个   也可能是由于HTTP请求上下文被中止   服务器(可能是由于服务关闭)。查看服务器日志   了解更多详情。“

我已经尝试了一些想法,目前我的对象看起来像这样:

[DataContract]
    public class FilePacket : IDisposable
    {
        //[MessageHeader(MustUnderstand = true)]
        [DataMember]
        public string fileName;

        //[MessageHeader(MustUnderstand = true)]
        [DataMember]
        public long fileSize;

        //[MessageBodyMember(Order = 1)]
        [DataMember]
        public System.IO.Stream fileByteStream;

        public void Dispose()
        {
            if (fileByteStream != null)
            {
                fileByteStream.Close();
                fileByteStream = null;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您要做的第一件事就是检查您是否在绑定中使用transferMode作为Streamed

<system.serviceModel>
     …
    <bindings>
      <basicHttpBinding>
        <binding name="ExampleBinding" transferMode="Streamed"/>
      </basicHttpBinding>
    </bindings>
     …
<system.serviceModel>

第二件事你应该使用MessageContract

[MessageContract]
public class FilePacket
{
   [MessageHeader]
   public string fileName;

   [MessageBodyMember]
   public System.IO.Stream fileByteStream;

   ...
}

fileByteStream剩余的属性外,您应使用MessageHeader属性进行修饰。

最后一件事是确保为maxReceivedMessageSize属性设置了正确的值以克服大小限制。

参见这些参考资料

http://msdn.microsoft.com/en-us/library/ms733742.aspx

http://msdn.microsoft.com/en-us/library/ms789010.aspx

答案 1 :(得分:0)

我现在已经开始工作了(感谢帮助人员)。 似乎有各种各样的事情可能出错并导致问题。 首先,我从Stream变为MemoryStream;并确保它在整个过程中都被这样使用(我在尝试一些选项时注意到你可以将DataContract设置为使用Stream,并且实际上使用的是FileStream;这会造成严重破坏,并花了几分钟时间注意到)

我从DataContract更改为MessageContract(确保将MemoryStream设置为[MessageBodyMember(Order = 1)])。

在App Config中,我将transferMode设置为“Streamed”,并确保将maxBufferSize设置为一个巨大的值。