0

我正在使用 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;
            }
        }
    }
4

2 回答 2

1

您要做的第一件事是检查您是否在绑定中使用transferModeas 。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

于 2012-07-09T19:05:39.033 回答
0

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

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

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

于 2012-07-10T09:25:46.653 回答