我正在使用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;
}
}
}
答案 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
属性设置了正确的值以克服大小限制。
参见这些参考资料
答案 1 :(得分:0)
我现在已经开始工作了(感谢帮助人员)。 似乎有各种各样的事情可能出错并导致问题。 首先,我从Stream变为MemoryStream;并确保它在整个过程中都被这样使用(我在尝试一些选项时注意到你可以将DataContract设置为使用Stream,并且实际上使用的是FileStream;这会造成严重破坏,并花了几分钟时间注意到)
我从DataContract更改为MessageContract(确保将MemoryStream设置为[MessageBodyMember(Order = 1)])。
在App Config中,我将transferMode设置为“Streamed”,并确保将maxBufferSize设置为一个巨大的值。