无法将图像文件作为部件Datacontract发送

时间:2014-07-02 09:05:34

标签: wcf rest service

我正在开发一个Wcf Restful Service,其中包含数据合同“User”,如下所示

[DataContract]
public class User
{
    public User()
    {

    }
    [DataMember(Name = "Name")]
    public string Name { get; set; }
    [DataMember(Name = "Mobile")]
    public string Mobile { get; set; }
    [DataMember(Name = "Email")]
    public string Email { get; set; }
    [DataMember(Name = "IsImageUpdated")]
    public bool IsImageUpdated { get; set; }
}

现在我想添加一个Image类型的模式数据成员,当我尝试使用Stream类型添加Image时显示异常

    [DataMember(Name = "Iamge")]
    public Stream Image { get; set; }

“InnerException消息是'Type'Cystem.IO.FileStream',数据协定名称为'FileStream:http://schemas.datacontract.org/2004/07/System.IO'不是预期的。请考虑使用DataContractResolver或将任何静态未知的类型添加到已知列表中types - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表。'。有关更多详细信息,请参阅InnerException。“

我正在开发的服务有很多数据合同,我读了一些帖子说可以通过将Datacontract更改为消息合同来解决问题,服务是否支持不同的合同类型(如数据,消息)。

我需要一个解决方案。

1 个答案:

答案 0 :(得分:1)

使用WebHttpBinding时无法实现。 仅当绑定具有SOAP消息格式并且使用MessageContract而不是DataContract时,才能组合流式和缓冲内容。

支持使用byte []或直接返回流。

[DataMember(Name = "Iamge")]
public byte[] Image { get; set; }

[OperationContract]
[WebGet(UriTemplate = "/Image")]
Stream GetImage();

或使用NetTcpBinding,WsHttpBinding,BasicHttpBinding,......

[MessageContract]
public class ImageData
{
    [MessageBodyMember]
    public Stream Image { get; set; }
    [MessageHeader]
    public string Name { get; set; }
}