WCF REST Загрузка файла - PullRequest
3 голосов
/ 12 июля 2011

Я разрабатываю веб-сервис WCF, который должен иметь возможность загружать файлы между прочим.

В настоящее время мой метод добавления элемента floorplan выглядит следующим образом:

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "Floorplan?token={token}&floorplan={floorplan}")]
string XmlInputFloorplan(string token, string floorplan);

Мне нужно изменить его так, чтобы изображение было загружено как часть этого вызова, который можно использовать в таком методе, как:

public static Guid AddFile(byte[] stream, string type);

В этом случае byte[] - это содержимое изображения.Полученный гид затем передается на слой данных, и добавление плана этажа завершается.

Поэтому мне нужно выяснить две вещи:

1) Как мне изменить XmlInputFloorplan метод интерфейса, позволяющий также использовать изображение в качестве параметра?
2) Как использовать службу после изменения?

Спасибо!

Вот как я это решил:

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "Floorplan")]
XmlDocument XmlInputFloorplan(Stream content);

Ожидает входной XML, например:

<?xml version="1.0" encoding="us-ascii" ?>
<CreateFloorplanRequest>
  <Token></Token>
  <Floorplan></Floorplan>
  <Image></Image>
</CreateFloorplanRequest>

И изображение содержит строку в кодировке 64, которая представляет файл изображения, который я преобразовываю в байт [] через:

XmlDocument doc = new XmlDocument();
doc.Load(content);
content.Close();

XmlElement body = doc.DocumentElement;
byte[] imageBytes = Convert.FromBase64String(body.ChildNodes[2].InnerText);

Для этого мне пришлось настроить Web.config так:

<service behaviorConfiguration="someBehavior" name="blah.blahblah">
    <endpoint 
        address="DataEntry" 
        behaviorConfiguration="web" 
        binding="webHttpBinding" 
        bindingConfiguration="basicBinding" 
        contract="blah.IDataEntry" />
</service>

<bindings>
  <webHttpBinding>
    <binding name="basicBinding" maxReceivedMessageSize ="50000000"
        maxBufferPoolSize="50000000" >
      <readerQuotas maxDepth="500000000"
        maxArrayLength="500000000" maxBytesPerRead="500000000"
        maxNameTableCharCount="500000000" maxStringContentLength="500000000"/>
      <security mode="None"/>
    </binding>
  </webHttpBinding>
</bindings>

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Ваш URI будет выглядеть совершенно по-другому - как-то так (я должен сделать некоторые предположения)

[OperationContract]
[WebInvoke(Method = "POST",
           ResponseFormat = WebMessageFormat.Xml,
           BodyStyle = WebMessageBodyStyle.Wrapped,
           UriTemplate = "Floorplan?type={type}&token={token}&floorplan={floorplan}")]
Guid XmlInputFloorplan(string type, string token, string floorplan, Stream image);

Я позволил себе сменить байтовый массив на Stream, который дает вам возможность потоковой передачи изображения, если оно будет большим (но не требует потоковой передачи)

Чтобы вызвать это, вы можете создать WebRequest с правильным Uri (включая тип, токен и план этажа) и выполнить POST. Сделайте тип содержимого правильным для формата изображения (jpeg, png и т. Д.) И получите поток запросов, копирующий изображение в него. Затем вызовите GetResponse в WebRequest, чтобы сделать HTTP-запрос

2 голосов
/ 12 июля 2011

Вы не сможете передать байтовый массив как GET. Передача такого большого количества данных в строку запроса wouldent work. Вам нужно будет сделать http POST

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