Frage

Ich habe eine einfache C # Web-Service-Proxy-Klasse, die ich mit WSDL.exe erstellt. Ich bin der Aufruf eine Methode auf dem Remote-Web-Service, und es wird darunter eine Reihe von WS-Addressing und WS-Security-Header, die ich nicht will (und dass der Server erstickt an). Hier ist ein Beispiel für die rohe Seife Anfrage:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <soap:Header>
    <wsa:Action></wsa:Action>
    <wsa:MessageID>urn:uuid:22f12267-b162-4703-a451-2d1c5c5a619b</wsa:MessageID>
    <wsa:To>http://example.com/wstest</wsa:To>
    <wsse:Security>
      <wsu:Timestamp wsu:Id="Timestamp-5c9f0ef0-ab45-421d-a633-4c4fad26d945">
        <wsu:Created>2009-04-15T16:27:25Z</wsu:Created>
        <wsu:Expires>2009-04-15T16:32:25Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soap:Header>
  <soap:Body>
    <Func1 xmlns="http://example.com">
      <arg_1 xmlns="">blah</arg_1>
      <arg_2 xmlns="">blah2</arg_2></arg_2>
    </Func1>
  </soap:Body>
</soap:Envelope>

Aber Ich kümmere mich nicht um die WS-Addressing / WS-Security Sachen . Ich habe nichts getan, um es zu schließen. Das scheint .NET WSE 3.0-Paket sich standardmäßig hinzufügen. Gibt es eine Möglichkeit diese loswerden? Ich kann keine Eigenschaften auf meinem Proxy-Objekt sehen, die mir erlauben, diese Abschnitte zu entfernen. Ich habe versucht:

proxyObject.Addressing.Clear();
proxyObject.Security.Clear();

Die veranlassen, eine Null-Referenz-Ausnahme, wenn ich meine Web-Service-Methode aufrufen.

Ich möchte, dass die SOAP-Anforderung wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
  </soap:Header>
  <soap:Body>
    <Func1 xmlns="http://example.com">
      <arg_1 xmlns="">blah</arg_1>
      <arg_2 xmlns="">blah2</arg_2></arg_2>
    </Func1>
  </soap:Body>
</soap:Envelope>

Vielen Dank im Voraus

War es hilfreich?

Lösung

Nun, ich am Ende mit einer Technik ich in der Vergangenheit verwendet habe. Ich habe Klassen, die implementieren SoapFilter und PolicyAssertion , die mir erlauben, den rohen XML der SOAP-Anforderung zu ändern, bevor es gesendet wird. Im Folgenden finden Sie ein Beispiel:

    public class MyPolicy : SoapFilter
    {
        public override SoapFilterResult ProcessMessage(SoapEnvelope envelope)
        {
            // Remove all WS-Addressing and WS-Security header info
            envelope.Header.RemoveAll();

            return SoapFilterResult.Continue;
        }
    }

    public class MyAssertion : PolicyAssertion
    {
        public override SoapFilter CreateClientInputFilter(FilterCreationContext context)
        {
            return null;
        }

        public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
        {
            return new MyPolicy();
        }

        public override SoapFilter CreateServiceInputFilter(FilterCreationContext context)
        {
            return null;
        }

        public override SoapFilter CreateServiceOutputFilter(FilterCreationContext context)
        {
            return null;
        }
    }

Dann in Ihrem Web-Service-Proxy des contructor gelten Sie die Richtlinie:

/// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.1433")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]       
 [System.Web.Services.WebServiceBindingAttribute(Name="MyBinding", Namespace="http://example.com")]
    public partial class MyWebClient : WebServicesClientProtocol {

        // ... member variables here

        /// <remarks/>
        public MyWebClient()
        {
            this.Url = "http://example.com";           
            if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else {
                this.useDefaultCredentialsSetExplicitly = true;
            }

            // Apply policy here
            Policy policy = new Policy();
            policy.Assertions.Add(new MyAssertion());
            this.SetPolicy(policy); 
        }
  }

Andere Tipps

, um den Adressheader entfernen i in einem meinem App den Code unten verwendet wird.

  public override void SecureMessage(SoapEnvelope envelope, Security security)
    {
       //remove addressing Header from envelope

        AddressingHeaders objAH = new AddressingHeaders(envelope);

        objAH.RemoveXml(envelope);


        //Add Wahtever security token you want to add.

        security.Tokens.Add(bla-bla-bla);

    }

Ich habe SecureMessage Funktion, weil ich Sicherheitstoken hinzufügen wollte, aber gleiche Code kann in verwendet werden Process Funktion.

Ich frage mich, ob Ihr Problem nicht auch einfach nicht mit WSp gelöst wurde>

Auf der Grundlage der Antwort auf dieser Seite, ich den Code unten hinzugefügt spezifische Header zu entfernen (durch tagname) rekursiv aus XML.

Public Overrides Function ProcessMessage(ByVal envelope As SoapEnvelope) As SoapFilterResult
    ' Remove all WS-Addressing and WS-Security header info
    RemoveTag(envelope.DocumentElement, "wsa:Action")
    RemoveTag(envelope.DocumentElement, "wsa:MessageID")
    RemoveTag(envelope.DocumentElement, "wsa:To")
    Return SoapFilterResult.[Continue]
End Function

Private Sub RemoveTag(ByVal XE As System.Xml.XmlElement, ByVal TagName As String)
    For Each N As XmlNode In XE
        If N.ChildNodes.Count > 0 Then
            RemoveTag(N, TagName)
        End If
        If N.Name = TagName Then
            XE.RemoveChild(N)
        End If
    Next
End Sub

ich den einfachste Weg gefunden, diese Adressierung und Sicherheit Header zu entfernen, war es, die Web-Service-Konfiguration ändern BasicHttpBinding zu verwenden, anstatt WSHttp binding.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top