代码之家  ›  专栏  ›  技术社区  ›  Francisco Noriega

有没有办法从asp.net webmethod中获取原始soap请求?

  •  9
  • Francisco Noriega  · 技术社区  · 14 年前

    例子:

    public class Service1 : System.Web.Services.WebService
    {
       [WebMethod]
       public int Add(int x, int y)
       {
           string request = getRawSOAPRequest();//How could you implement this part?
           //.. do something with complete soap request
    
           int sum = x + y;
           return sum;
       }
    }
    
    4 回复  |  直到 13 年前
        1
  •  11
  •   nivlam    14 年前

    soapextensions的另一种选择是实现ihttpmodule并在输入流传入时获取它。

    public class LogModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += this.OnBegin;
        }
    
        private void OnBegin(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            HttpContext context = app.Context;
    
            byte[] buffer = new byte[context.Request.InputStream.Length];
            context.Request.InputStream.Read(buffer, 0, buffer.Length);
            context.Request.InputStream.Position = 0;
    
            string soapMessage = Encoding.ASCII.GetString(buffer);
    
            // Do something with soapMessage
        }
    
        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }
    
        2
  •  6
  •   Eric Petroelje    14 年前

    是的,您可以使用soapextensions来完成。这里有一个 nice article 贯穿整个过程。

        3
  •  6
  •   Steven de Salas Alexander Bollaert    13 年前

    你也可以阅读 contents of the Request.InputStream .

    这样做更有用,例如在需要根据输入内容在webmethod中执行验证或其他操作的情况下。

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

    注: 更新以反映以下约翰的评论。

        4
  •  1
  •   Randolpho    14 年前

    我假设您想要记录soap请求以进行跟踪;也许您的服务的一个消费者告诉您他们正在向您发送好的soap,但是您不相信,是吗?

    在这种情况下,你应该(暂时的) enable trace logging on your service .

    如果您尝试进行通用日志记录,不要使用soap包,因为它很重;您的日志会很快膨胀。只需记录重要的内容,例如“add called,x=foo,y=bar”。