客户端有一个服务,它发送我们需要通过.Net MVC4项目接收的xml soap格式的请求。请求的格式为:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ReceiveStatusUpdate xmlns="http://test.com">
<StatusUpdate>
<Reference>214563</Reference>
<ThirdPartyReference>YOUR-REFERENCE</ThirdPartyReference>
<Status>Pending</Status>
</StatusUpdate>
</ReceiveStatusUpdate>
</soap:Body>
</soap:Envelope>
我想知道接收和解析此请求的最佳方式是什么?
答案 0 :(得分:1)
这样做的方式略有苛刻,但它对我有用,而且它是我需要处理的一次性请求类型。我基本上把请求体拉出来并用XDocument解析它
public ActionResult Update()
{
var inputStream = Request.InputStream;
inputStream.Seek(0, SeekOrigin.Begin);
var request = new StreamReader(inputStream).ReadToEnd();
var soapRequest = XDocument.Parse(request);
...
}
答案 1 :(得分:0)
在我看来 - 也许有人可以说更多,就是选择WebAPI。它使用起来很简单,只是一些代码,所以它很轻松。你有很多工具可以在.NET中处理XML文档,所以这对你来说不会有任何问题。
还有一件事。在你的XML中有错误,结束标记&#34; ReceiveStatusUpdate&#34;错误拼写。
这一开始会有所帮助:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api 然后,您可以使用Fiddler将这些XML发布到您的WebAPI。
答案 2 :(得分:0)
实现这一目标的最简单方法是使用老式的asmx Web服务。
通过Web API进行曝光需要大量工作,因为它不支持开箱即用的SOAP绑定。
您可以使用WCF服务,但配置起来可能非常费时费力,这是为其灵活性付出的代价。
简而言之,如果您只需要支持SOAP绑定,请使用为该作业制作的工具 - asmx Web服务。
只需将新项添加到Web Service(ASMX)类型的MVC项目中,如下所示(您显然已在单独的文件中定义了StatusUpdate类)。
/// <summary>
/// Summary description for StatusWebService
/// </summary>
[WebService(Namespace = "http://test.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class StatusWebService : System.Web.Services.WebService
{
[WebMethod]
public void ReceiveStatusUpdate(StatusUpdate StatusUpdate)
{
//Do whatever needs to be done with the status update
}
}
public class StatusUpdate
{
public string Reference { get; set; }
public string ThirdPartyReference { get; set; }
public string Status { get; set; }
}
答案 3 :(得分:0)
可能不是最好的答案,但这是我现在正在做的事情。
[HttpPost]
public IHttpActionResult HotelAvailRQ(HttpRequestMessage request)
{
// Parse the SOAP request to get the data payload
var xmlPayload = MyHelper.GetSoapXmlBody(request);
// Deserialize the data payload
var serializer = new XmlSerializer(typeof(OpenTravel.Data.CustomAttributes.OTA_HotelAvailRQ));
var hotelAvailRQ = (OpenTravel.Data.CustomAttributes.OTA_HotelAvailRQ)serializer.Deserialize(new StringReader(xmlPayload));
return Ok();
}
助手类
public static class MyHelper
{
public static string GetSoapXmlBody(HttpRequestMessage request)
{
var xmlDocument = new XmlDocument();
xmlDocument.Load(request.Content.ReadAsStreamAsync().Result);
var xmlData = xmlDocument.DocumentElement;
var xmlBodyElement = xmlData.GetElementsByTagName("SOAP-ENV:Body");
var xmlBodyNode = xmlBodyElement.Item(0);
if (xmlBodyNode == null) throw new Exception("Function GetSoapXmlBody: Can't find SOAP-ENV:Body node");
var xmlPayload = xmlBodyNode.FirstChild;
if (xmlPayload == null) throw new Exception("Function GetSoapXmlBody: Can't find XML payload");
return xmlPayload.OuterXml;
}
}