WCF: как Cand вы добавляете несколько MessageBodyMember к MessageContract, если один из них является Stream
Мне нужно, чтобы все 3 элемента были в теле, чтобы клиент мог их использовать, он не может изменить данные в заголовке (первые 2, где в MessageHeader
вначале):
[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; }
}
И ошибка, которую я получаю:
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)
Как я могу это исправить?
1 ответ
Решение
Если один из ваших атрибутов является потоком, у вас может быть только другой атрибут Header. Затем вы можете сохранить FileName и itemId в заголовке для передачи.