2013-05-11 60 views
0

我是新增的Web服务,需要捕获将发送到我的Web服务的SOAP XML消息。我发现文章说你可以从你的asmx WebMethod中读取Request.InputStream的内容。如何捕获来自外部Web服务的传入SOAP XML消息(WSDL格式)

Capturing SOAP requests to an ASP.NET ASMX web service

代码如下:

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 
using System.IO; 
using System.Text; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace SoapRequestEcho 
{ 
    [WebService(
    Namespace = "http://soap.request.echo.com/", 
    Name = "SoapRequestEcho")] 
    public class EchoWebService : WebService 
    { 

    [WebMethod(Description = "Echo Soap Request")] 
    public XmlDocument EchoSoapRequest(int input) 
    { 
     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Get raw request body 
     Stream receiveStream = HttpContext.Current.Request.InputStream 

     // Move to begining of input stream and read 
     receiveStream.Position = 0; 
     using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
     { 
     // Load into XML document 
     xmlSoapRequest.Load(readStream); 
     } 

     // Return 
     return xmlSoapRequest; 
    } 
    } 
} 

不过,我很困惑,因为这要求一个整型输入参数。我想我可以删除它,但我不确定外部用户如何调用我的Web服务并向其发布XML消息。我如何对此进行测试以发送XML消息并确保我可以在流中捕获它们?任何提示或链接将不胜感激,谢谢。

回答

0

“我刚接触Web服务,需要捕获将发送到我的Web服务的SOAP XML消息。”

SOAP只是一个在web服务的使用者和web服务之间交换信息的协议。考虑一下这种握手,将要传递给Web服务的数据打包到SOAP信封中。 Web服务的使用者会将数据打包到SOAP信封中。这引出了一个问题 - 消费者如何知道要发送什么?

当您打开您的webservices页面时,它应该显示您支持的操作列表。如果您点击EchoSoapRequest,您将看到一个示例SOAP请求,该请求应发送到您的服务及其响应。您只需处理用户在代码中发送的参数。

在这种情况下,您的webservice需要一个int。使用Web服务的用户将在SOAP信封中发送一个int打包。如果你想让你的用户发送一个字符串,然后声明一个字符串作为输入。

附注:作为一个附注,你应该看看RESTful Web服务及其优点,如果你从头开始。

+0

感谢您的回复。我的要求是使用SOAP而不是RESTful。我认为我没有正确解释自己。我有一个将发送给我的XML的WSDL。这意味着一旦我捕获了XML,我知道如何使用读取值。我不相信我的webservice需要一个int或一个字符串,而是使用WSDL格式的XML。我必须以某种方式验证随WSDL文件一起发送的内容吗?或者我只是捕获流中的任何XML?对不起,我有点困惑。 – Stan 2013-05-11 19:33:38

+0

您的WSDL向您显示打击您的Web服务所需的SOAP调用。现在,如果您的webservice需要XML,那么您可以将输入参数更改为XmlElement输入,而不是int输入。这样消费者就可以发送XML,并且可以在代码中解析它。看看这个[link](http://msdn.microsoft.com/en-us/library/aa480498.aspx) – eightyeight 2013-05-12 12:49:18

相关问题