stream - 通过 WCF 流式传输文件时出现 ArgumentNullException

标签 stream wcf filestream

我有一个 WCF 流式二进制文件。以下是契约(Contract)的简短版本。

[MessageContract()]
public class DocumentTransfer
{
    [MessageHeader(MustUnderstand = true)]
    public string Title { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public string FileName { get; set; }

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream Data;
}

一切正常,但在某些情况下,只需要更新与文件关联的一些其他值,而不需要更新文件本身。在这种情况下,客户端设置 Data = null。然后 Data 属性无法被解释/序列化并抛出此异常:

System.ServiceModel.Dispatcher.StreamFormatter.Serialize(XmlDictionaryWriter writer, Object[] parameters, Object returnValue)
System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(XmlDictionaryWriter writer, MessageVersion version, Object[] parameters, Object returnValue, Boolean isRequest)
System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)
System.ServiceModel.Channels.BodyWriter.WriteBodyContents(XmlDictionaryWriter writer)
System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
System.ServiceModel.Channels.Message.OnWriteMessage(XmlDictionaryWriter writer)
System.ServiceModel.Channels.Message.WriteMessage(XmlDictionaryWriter writer)
System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(Message message, Stream stream)
System.ServiceModel.Channels.HttpOutput.WriteStreamedMessage(TimeSpan timeout)
System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
...UploadDocument(DocumentTransfer request)
...UploadDocument(DocumentTransfer request) in ...

大家有什么想法吗?

最佳答案

当正文为空时,您会在 SerializeBodyContents 中收到错误。

您可以在没有文件时创建不同的操作,或者在流中放入一个字节以避免异常。如果您无法更改契约(Contract),则最好选择第一个选项,最后一个选项更可取。

关于stream - 通过 WCF 流式传输文件时出现 ArgumentNullException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339055/

相关文章:

C++ 打开文件流

java - HTTP:如何正确从 BufferedHttpEntity 读取数据

java - 将函数传递到 Java 8 中 Stream 的过滤器方法中

c# - WCF 中 MustUnderstand 属性的用途是什么?

wcf - 如何公开具有多种服务行为的单个 WCF 服务?

c++ - 使用 rdbuf() 和运算符 << 在 C++ 中复制流时出错

MongoDb 在 NestJs 中的变更流

javascript - 将 Node.js 缓冲区转换为字符串,然后转换为 JSON

wcf - Autofac WCF - CloseChannel 在负载测试下被多次调用

sql - 在sql server中存储图像