Каков наилучший способ отправки нескольких файлов в службу WCF? - PullRequest
8 голосов
/ 13 мая 2009

Мы создаем службу WCF, для которой требуется от 2 до 4 файлов изображений (каждый размером около 2–5 тыс.), Отправляемых в качестве входных параметров, а также около 6 параметров текстового поля. Данные, отправленные обратно, просто состоят из нескольких текстовых значений.

Я понимаю, что один файл можно отправить в виде потока, но я не уверен, как отправлять несколько файлов.

Клиентами в этом случае будут третьи стороны, для которых мы хотели бы сделать взаимодействие с нашим сервисом WCF максимально простым.

1 Ответ

24 голосов
/ 14 мая 2009

Вероятно, есть много способов сделать это, но вот мои мысли. Обратите внимание, что я только что включил произвольное количество строк, которые можно добавлять / удалять по мере необходимости.

Во-первых, вам понадобится некий «входной» объект, который будет передан вашей службе WCF, содержащей ваши изображения и строковые значения. Обратите внимание, что свойство Images представляет собой массив байтовых массивов; это так, что вы можете включить несколько изображений.

[DataContract]
public class InputObject
{
    [DataMember]
    public byte[][] Images { get; set; }

    [DataMember]
    public string FirstValue { get; set; }

    [DataMember]
    public string SecondValue { get; set; }
}

Далее вам понадобится объект, который будет возвращать ваша служба WCF ...

[DataContract]
public class ReturnObject
{
    [DataMember]
    public string FirstValue { get; set; }

    [DataMember]
    public string SecondValue { get; set; }
}

Ваш ServiceContract будет выглядеть следующим образом.

[ServiceContract]
public interface IService1
{
    [OperationContract]
    ReturnObject UploadData ( InputObject input );
}

И ваш класс обслуживания, как это.

public class Service1 : IService1
{
    public ReturnObject UploadData ( InputObject input )
    {
        // Do your thing with InputObject data

        ReturnObject returnObject = new ReturnObject
                                        {
                                            FirstValue = "MyFirstValue" ,
                                            SecondValue = "MySecondValue"
                                        };

        return returnObject;
    }
}

Вам необходимо убедиться, что привязки вашей службы соответствуют отправке данных изображения, поэтому целесообразно увеличить некоторые ограничения по умолчанию. Вот пример привязки из конфигурации моего сервиса.

<wsHttpBinding>
  <binding name="Service1Binding" maxReceivedMessageSize="1000000">
    <readerQuotas maxArrayLength="1000000"
                  maxBytesPerRead="1000000"
                  maxDepth="1000000"
                  maxNameTableCharCount="1000000"
                  maxStringContentLength="1000000"/>
  </binding>
</wsHttpBinding>

Убедитесь, что вы указали это в качестве конфигурации привязки для вашего сервиса.

<endpoint address="" 
          binding="wsHttpBinding" 
          contract="WcfService5.IService1" 
          bindingConfiguration="Service1Binding">

Теперь все, что вам нужно сделать, это сослаться на это из службы вашего клиента и позвонить ему.

var images = new byte[2][];
images[0] = System.IO.File.ReadAllBytes( @"D:\Development\TestImage.bmp" );
images[1] = System.IO.File.ReadAllBytes( @"D:\Development\TestImage.jpg" );

var input = new InputObject
                {
                    Images = images ,
                    FirstValue = "MyFirstValue" ,
                    SecondValue = "MySecondValue"
                };

var client = new Service1Client();
client.UploadData( input );

Надеюсь, это поможет вам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...