2016-05-24 1 views
1

Я хотел бы отправить следующий XML-документ моему контроллеру Web Api 2; однако параметр [FromBody] всегда равен нулю.Проблема с отправкой XML в Web Api через http Почтовый запрос

Вот запрос XML тело:

<razorInbound server="PortfolioExposureServer" request="lookupRiskPointRecord"> 
 
    <caller>RazorClient</caller> 
 
    <responseMode>xml</responseMode> 
 
    <body> 
 
    <conditions> 
 
     <fromOffset>0</fromOffset> 
 
     <top>100</top> 
 
     <condition> 
 
     <keyPath> 
 
      <keyElement nodeOffset='1'>Currency</keyElement> 
 
      <keyElement nodeOffset='2'>ID</keyElement> 
 
     </keyPath> 
 
     <lookupValue>USD</lookupValue> 
 
     </condition> 
 
    </conditions> 
 
    </body> 
 
</razorInbound>

Использование Почтальон для отправки запроса, выглядит следующим образом:

POST /api/razorXmlRequest HTTP/1.1 
 
Host: localhost:5000 
 
Content-Type: application/xml 
 
Cache-Control: no-cache 
 
Postman-Token: 6ca91ebf-31e0-77f2-6f81-cb9993b69b1a 
 

 
<razorInbound server="PortfolioExposureServer" request="lookupRiskPointRecord"> 
 
    <caller>RazorClient</caller> 
 
    <responseMode>xml</responseMode> 
 
    <body> 
 
    <conditions> 
 
     <fromOffset>0</fromOffset> 
 
     <top>100</top> 
 
     <condition> 
 
     <keyPath> 
 
      <keyElement nodeOffset='1'>Currency</keyElement> 
 
      <keyElement nodeOffset='2'>ID</keyElement> 
 
     </keyPath> 
 
     <lookupValue>USD</lookupValue> 
 
     </condition> 
 
    </conditions> 
 
    </body> 
 
</razorInbound>

И контроллер Web Api 2:

Примечание: Параметр param всегда null

Я считаю, что нужно правильное определение класса, чтобы правильно отобразить запрос XML, но я не знаю, как построить его.

using System; 
 
using System.Threading.Tasks; 
 
using System.IO; 
 
using System.Text; 
 
using RazorServices; 
 
using System.Net.Http; 
 
using System.Web.Http; 
 
using System.Xml.Linq; 
 
using System.Net; 
 
using System.Xml; 
 

 
namespace RazorWebApi.Controllers 
 
{ 
 
    [Route("api/razorXmlRequest")] 
 
    public class RazorXmlRequestController : ApiController 
 
    { 
 
     public class RawXml { 
 
      public string RazorXml { get; set; } 
 
     } 
 

 
     [HttpPost] 
 
     public async Task<HttpResponseMessage> Post([FromBody]RawXml param) 
 
     { 
 
      HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.OK); 
 

 
      // code omitted... 
 
\t \t \t 
 
      return resp; 
 
     } 
 
    } 
 
}

И, кстати, мы в настоящее время становится вокруг этого вопроса путем создания StreamReader объекта, чтобы вытащить из this.Request.Content; однако в моем модульном тесте мне нужно отправить свой xml в качестве параметра.

[HttpPost] 
 
     public async Task<HttpResponseMessage> Post() // [FromBody]RawXml param) 
 
     { 
 
      HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.OK); 
 

 
      StreamReader sr = new StreamReader(await this.Request.Content.ReadAsStreamAsync(), Encoding.UTF8); 
 
      string xml = sr.ReadToEnd(); 
 

 
      if (xml == null || xml.Length < 4) 
 
      { 
 
       throw new RazorServicesException("Invalid XML"); 
 
      } 
 
      RazorSession cred = RzWebApi.Cred; 
 
      string reply = await RzWebApi.RazorSrv.xmlRequests.Request(cred, xml); 
 
      resp.Content = new StringContent(reply, System.Text.Encoding.UTF8, "text/plain"); 
 
      return resp; 
 
     }

ответ

1

Окончательное решение было изменить сообщение типа парам к XElement:

[Route("api/razorXmlRequest")] 
public class RazorXmlRequestController : ApiController 
{ 
    /// <summary> 
    /// Raw Razor request XML 
    /// </summary> 
    /// <returns>Razor reply message as text</returns> 
    [HttpPost] 
    public async Task<HttpResponseMessage> Post([FromBody]XElement xml) 
    { 
     HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.OK); 
     RazorSession cred = RzWebApi.Cred; 
     string reply = await RzWebApi.RazorSrv.xmlRequests.Request(cred, xml); 
     resp.Content = new StringContent(reply, System.Text.Encoding.UTF8, "application/xml"); 
     return resp; 
    } 
} 

Это работало прямо-таки даже без предоставления XmlFormatter как джентльменов было предложено выше (@TusharJ, спасибо в любом случае для входа) ,

1

вы можете настроить Web API использовать XmlSerializer в вашем WebApiConfig.Register:

config.Formatters.XmlFormatter.UseXmlSerializer = истина;

+0

Оказывается, что я могу изменить метод Post на 'Post ([FromBody] XElement param)' и заголовок 'Content-Type: application/xml', и это решит проблему. Содержимое 'xml' передается контроллеру даже без вашего предложения выше. –

Смежные вопросы