Search code examples
c#web-servicessoapmessagecontract

WCF: How cand you add multiple MessageBodyMember to a MessageContract if one is Stream


I need all 3 items to be in the Body so that the client can use them, He cannot modify the data in the Header (first 2 where in the MessageHeader at first):

[MessageContract]
public class UploadRequest
{
    [MessageBodyMember(Order = 2)]
    public string FileName { get; set; }

    [MessageBodyMember(Order = 1)]
    public Guid itemId { get; set; }

    [MessageBodyMember(Order = 3)]
    public Stream Stream { get; set; }
}

And the error I receive is:

System.InvalidOperationException: In order to use Streams with the MessageContract programming model, the type UploadRequest must have a single member with MessageBodyMember attribute and the member type must be Stream.
            at System.ServiceModel.Dispatcher.StreamFormatter.ValidateAndGetStreamPart(MessageDescription messageDescription, Boolean isRequest, String operationName)
            at System.ServiceModel.Dispatcher.OperationFormatter..ctor(OperationDescription description, Boolean isRpc, Boolean isEncoded)
            at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter..ctor(OperationDescription description, DataContractFormatAttribute dataContractFormatAttribute, DataContractSerializerOperationBehavior serializerFactory)
            at System.ServiceModel.Description.DataContractSerializerOperationBehavior.GetFormatter(OperationDescription operation, Boolean& formatRequest, Boolean& formatReply, Boolean isProxy)
            at System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
            at System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription contract, ClientRuntime proxy, DispatchRuntime dispatch)
            at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
            at System.ServiceModel.ServiceHostBase.InitializeRuntime()
            at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
            at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
            at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

How can I fix it?


Solution

  • If one of your attribute is a stream, you can only have another attribute Header. Then you can store FileName and itemId in the header to pass in.