2009-01-20 15 views
10

Dzwonię do zewnętrznego serwisu HTTPS.Uzyskaj komunikat SOAP przed wysłaniem go do usługi WebService w .NET

Aby sprawdzić, co jest nie tak, właściciel potrzebuje wysłanego żądania SOAP.

Mam odniesienia www i klasy proxy generowanej generowane przez VS 2008 ...

Czy istnieje sposób, aby zobaczyć komunikat SOAP tuż przed wysłaniem?

Myślę w jakimś kodzie .net ... ponieważ Sniffery, których próbowałem, nie "widziały" inwokacji webservice nie wiem dlaczego.

Odpowiedz

5
+0

Drugie łącze ma wiele opcji. Przyjęta odpowiedź niekoniecznie jest najlepsza (wszystkie trzy rozwiązania są dobre). FYI, najbardziej podobała mi się opcja Fiddlera. – Nullius

0

Jeśli ty pracuj w bardziej ograniczonym środowisku i nie korzystaj z luksusu korzystania z aplikacji takich jak Skrzypek, możesz wykonać następujące czynności:

  1. Generowanie odwołania do stron internetowych w zwykły sposób.
  2. Napisz kod, aby wykonać dowolne wywołanie metody sieciowej, do mnie.
  3. Tworzenie nowego projektu ASP .NET swojego wyboru, poszedłem z MVC 4.
  4. utworzyć uchwyt lub kontroler/działania, a ekstrakt strumienia żądania takiego:

using (var reader = new System.IO.StreamReader(Request.InputStream)) { result = reader.ReadToEnd(); }

  1. Umieść punkt przerwania i uruchom go w trybie debugowania.
  2. Ustaw na kliencie adres URL żądania SOAP na nowy kontroler/moduł obsługi.
  3. Uruchom klienta. Powinieneś złapać punkt przerwania w swojej aplikacji internetowej za pomocą komunikatu SOAP.

Nie jest to rozwiązanie idealne lub ładne, ale jeśli pracujesz w umiarkowanie ograniczonym środowisku, wykonuje on zadanie.

9

Można po prostu serializacji obiektu żądania, przed subtmit, tak:

var sreq = new SomeSoapRequest(); 

// ... fill in here ... 

var serxml = new System.Xml.Serialization.XmlSerializer(sreq.GetType()); 
var ms = new MemoryStream(); 
serxml.Serialize(ms, sreq); 
string xml = Encoding.UTF8.GetString(ms.ToArray()); 

// in xml string you have SOAP request 
2

Można użyć IClientMEssageInspector i IEndpointBehavior napełnić to.Znalazłem za pomocą tego sposobu można uchwycić dokładną prośbę mydła prawdopodobny jako skrzypek jednym:

utworzyć klasę jak to w tym samym projekcie:

public class ClientMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector 
    { 
     #region IClientMessageInspector Members 
     public string LastRequestXml { get; private set; } 

     public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
     { 

     } 

     public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
     { 
      string requestHeaderName = request.Headers.Action.Replace("urn:#",string.Empty); 
      LastRequestXml = request.ToString(); 
      string serializedRequestFile = string.Format(requestHeaderName + "_request_{0}.xml", DateTime.Now.ToString("yyyyMMddHHmmss")); 
      string exportedFolder = ConfigurationManager.AppSettings["SubmittedRequestXmLocation"]; 
      printSoapRequest(request, exportedFolder, serializedRequestFile); 

      return request; 
     } 

     public void printSoapRequest(System.ServiceModel.Channels.Message request, string exportedFolder, string fileName) 
     { 
      if (exportedFolder.Equals(string.Empty)) 
       return; 

      if (!Directory.Exists(exportedFolder)) 
      { 
       Directory.CreateDirectory(exportedFolder); 
      } 
      string exportedFile = string.Format("{0}\\{1}", exportedFolder, fileName); 
      if (File.Exists(exportedFile)) 
      { 
       File.Delete(exportedFile); 
      } 

      string strRequestXML = request.ToString(); 
      XDocument xDoc = XDocument.Parse(strRequestXML); 
      XmlWriter xw = XmlWriter.Create(exportedFile); 
      xDoc.Save(xw); 
      xw.Flush(); 
      xw.Close(); 
      LogOutput("Request file exported: " + exportedFile); 

     } 

    } 

    public class CustomInspectorBehavior : IEndpointBehavior 
    { 
     private readonly ClientMessageInspector clientMessageInspector = new ClientMessageInspector(); 

     public string LastRequestXml 
     { 
      get { return clientMessageInspector.LastRequestXml; } 
     } 

     public string LastResponseXml 
     { 
      get { return clientMessageInspector.LastRequestXml; } 
     } 

     public void AddBindingParameters(
      ServiceEndpoint endpoint, 
      System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
     { 
     } 

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
     { 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 
     } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
     { 
      clientRuntime.MessageInspectors.Add(clientMessageInspector); 
     } 
    } 

Następnie można nazwać to tak:

ProxyClass _class = new ProxyClass(); 
var requestInterceptor = new CustomInspectorBehavior(); 
      _client.Endpoint.Behaviors.Add(requestInterceptor); 

Po wywołaniu metody serwisowej automatycznie wykona przechwytywacz i wydrukuje wydruk. W ten sposób możesz także manipulować wiadomością mydła przed wysłaniem na serwer!

+0

Używam *** Web Service Reference ***, *** nie WCF Reference *** – Kiquenet

+0

Jeśli używasz Web Service Reference, możesz dokładnie zbudować całą kopertę z mydłem od zera. Jednak nie polecam go ze względu na jego solidną realizację i nowoczesny. – mting923

Powiązane problemy