是否可以使用mvc建模绑定soap请求?

时间:2015-01-16 14:00:54

标签: c# .net asp.net-mvc asp.net-mvc-4

客户端有一个服务,它发送我们需要通过.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>

我想知道接收和解析此请求的最佳方式是什么?

4 个答案:

答案 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;
    }
}