#xml #wcf #rest
#xml #wcf #rest
Вопрос:
Мне нужно иметь возможность передавать XML в службу RESTful WCF в виде строки, однако я изо всех сил пытаюсь это сделать. Может кто-нибудь, пожалуйста, сообщить мне, как я мог бы это сделать? Это должно быть отправлено в виде строки, я не могу включить это в контракт с данными и т.д. Пример контракта на обслуживание ниже
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "lookup",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml)]
Stream LookupPostcode(string requestXml);
Заранее большое спасибо
Ответ №1:
Это совершенно не по теме, но попытка преобразовать WCF в RESTful будет постоянной битвой, и вы в конечном итоге сдадитесь. Именно ориентированная на сообщения природа WCF, позволяющая настраивать все в XML на основе RPC и SOAP, настолько затрудняет написание простых служб REST.
Если вы не по уши увязли в своем проекте, попробуйте изучить другие альтернативы и отказаться от WCF для этой цели.
Комментарии:
1. Так было в WCF 3.5 и WCF 4, но здесь используется новый веб-API WCF wcf.codeplex.com это совершенно другая история. Он обладает всей необходимой гибкостью и полностью совместим с HTTP.
2. @Darrel сам никогда не использовал WCF 4, но
public JsonValue GetAll()
и огромное количество раздутого кода вокруг этого убивает меня.3. Если вы хотите simple, то у меня есть именно то, что вам нужно 🙂 bizcoder.com/index.php/2011/04/16 /…
4. @Darrel Теперь это уже кое-что, но я все еще не уверен. Подход WCF к REST имеет всевозможные архитектурные недостатки, которые делают его непригодным, по крайней мере, для меня. Но ваш код действительно хорош.
5. Я, конечно, понимаю ваш скептицизм, но новый материал WebAPI был серьезно переработан и выполнен под руководством некоторых опытных специалистов REST из самых разных слоев общества. Это не косметическое улучшение.
Ответ №2:
Попробуйте использовать XElement
or Stream
в качестве параметра вашего метода.
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "lookup",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml)]
Stream LookupPostcode(Stream requestXml);
…
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "lookup",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml)]
Stream LookupPostcode(XElement requestXml);
… Не уверен, что вы пытаетесь сделать внутри метода, или я, вероятно, мог бы предоставить дополнительную помощь.
Комментарии:
1. Удалось ли вам заставить параметр Stream работать в WCF 3.5 или это было только в WCF 4? Я так и не смог заставить это работать в 3.5.
2. Я постоянно использую его в .Net 3.5. Я полагаю, вам нужно изменить режим привязки с буферизации.
3. Прохладный. Я думаю, вы имеете в виду TransferMode = Streamed. Я всегда думал, что это работает только для потоковой передачи и не будет работать для обычных параметров.
Ответ №3:
Это серьезный взлом, но вы можете обернуть свой XML внутри <string>
тега, подобного этому.
XmlDocument body = new XmlDocument();
body.Load(...);
postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" body.OuterXml "]]></string>";
Ответ №4:
Обертывание xml в теги CDATA останавливает синтаксический анализатор от обработки его как xml:
myString = "<![CDATA[<thexml/>]]>"