Я разрабатываю веб-службу 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>