Есть ли способ получить необработанный SOAP-запрос из ASP.NET WebMethod? - PullRequest
9 голосов
/ 07 апреля 2010

Пример:

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 ]

11 голосов
/ 07 апреля 2010

Альтернативой 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();
    }
}
7 голосов
/ 21 мая 2011

Вы также можете прочитать содержимое 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;
    }
  }
}

ПРИМЕЧАНИЕ: Обновлено, чтобы отразить комментарий Джона ниже.

6 голосов
/ 07 апреля 2010

Да, вы можете сделать это с помощью SoapExtensions. Вот хорошая статья , которая проходит через процесс.

1 голос
/ 07 апреля 2010

Я предполагаю, что вы хотите записать SOAP-запрос на трассировку; возможно, у вас есть потребитель вашего сервиса, который говорит вам, что он посылает вам хорошее SOAP, но вы им не верите, да?

В этом случае вы должны (временно) включить регистрацию трассировки в вашей службе .

Если вы пытаетесь вести логи общего назначения, не беспокойтесь о пакете SOAP, так как он тяжелый; Ваши журналы быстро раздулись. Просто запишите важные вещи, например, например. Msgstr "Добавить вызванный, X = foo, Y = bar".

...