Использовать формат VXML для формата ответа сервиса XML REST? - PullRequest
1 голос
/ 26 января 2010

Я создал веб-сервис REST, используя WCF, и использую HTTP Post Method. Все объекты запроса и ответа представляют собой простой XML. Как и объект ответа:

<Response xmlns="http://WebService/WCF" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Approved>true</Approved>
<ApprovedCode>OK242C0010063439: X:</ApprovedCode>
<ValidationLogID>106</ValidationLogID>
<OrderNumber>D1FB8F95-4B50B216-295-14442</OrderNumber>
<RetString>Approval Code: OK242C0010063439: X:</RetString>
</Response>

Теперь Клиент просит нас изменить формат на формат VoiceXML, как показано ниже:

<?xml version="1.0" ?> 
<vxml version="2.0" xmlns="http://www.w3.org/2001/vxml">
 <form id="Response">
    <var name="Approved" expr="'true'" /> 
    <var name="RetString" expr="'Approval Code: OK242C0010063439: X:'" /> 
    <var name="ApprovedCode" expr="'OK242C0010063439: X:'" /> 
    <var name="ValidationLogID" expr="'106'" /> 
    <var name="OrderNumber" expr="'D1FB8F95-4B50B216-295-14442'" /> 
     <block>
            <return namelist="Approved RetString ApprovedCod ValidationLogID OrderNumber" /> 
    </block>
  </form>
</vxml>

Мне интересно, есть ли простой способ сделать это преобразование. В настоящее время я думаю создать и вернуть простую строку вместо XML для объекта ответа.

Спасибо за вашу помощь! :)

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Измените свой контракт, чтобы он возвращал поток, и используйте XmlWriter для записи в поток памяти и возврата этого.

0 голосов
/ 27 января 2010

Darrel, я пытался использовать Stream, но когда я тестировал с Fiddler 2, я получил только следующее содержимое:

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/octet-stream
Server: Microsoft-HTTPAPI/1.0
Date: Wed, 27 Jan 2010 15:37:27 GMT

Я использовал MemoryStream, код показан ниже:

    Stream st = new MemoryStream();
    XmlWriterSettings xms = new XmlWriterSettings();
    using (XmlWriter writer = XmlWriter.Create(st, new XmlWriterSettings()))
    {
       //do some writing
       writer.WriteStartElement("vxml", "http://www.w3.org/2001/vxml");
       writer.WriteAttributeString("version", "2.0");
       writer.WriteStartElement("form");
       writer.WriteAttributeString("id", "CompositeType");
       writer.WriteStartElement("var");
       writer.WriteAttributeString("name", "BoolValue");
       writer.WriteAttributeString("expr", composite.BoolValue.ToString());
       writer.WriteEndElement();
    }
    st.Flush(); 
    //this line is necessary, otherwise the returned content is 0
    st.Position = 0; 
    return st;

Не показывает содержимое в Fiddler.

Редактировать:

st.Flush(); 
//this line is necessary, otherwise the returned content is 0
st.Position = 0; 

Добавлено и содержимое ответа отображается правильно.

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