visual studio crear consumir c# .net web-services soap asmx

consumir - crear web service soap c# visual studio 2017



¿Hay alguna manera de obtener la solicitud SOAP sin procesar desde un ASP.NET WebMethod? (4)

Ejemplo:

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


Sí, puedes hacerlo usando SoapExtensions. Aquí hay un buen artículo que se ejecuta a través del proceso.


Supongo que quiere iniciar sesión en la solicitud SOAP para rastreo; tal vez tengas un consumidor de tu servicio que te dice que te están enviando un buen SOAP, pero no les crees, ¿verdad?

En ese caso, debe (temporalmente) habilitar el registro de rastreo en su servicio .

Si intenta hacer un registro de propósito general, no se moleste con el paquete SOAP, ya que es pesado; tus registros se hincharían rápido. Simplemente registre las cosas importantes, como por ejemplo "Agregar llamado, X = foo, Y = barra".


Una alternativa a SoapExtensions es implementar IHttpModule y capturar el flujo de entrada a medida que entra.

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


También puede leer el contenido de Request.InputStream .

De esta forma es más útil, como en los casos en que desea realizar validación u otras acciones dentro del WebMethod, dependiendo del contenido de la entrada.

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

NOTA: Actualizado para reflejar el comentario de Johns a continuación.