2009-04-15 1 views
4

У меня есть простой прокси-класс веб-службы C#, созданный с помощью WSDL.exe. Я вызываю метод на удаленной веб-службе, и он включает в себя кучу заголовков WS-Addressing и WS-Security, которые мне не нужны (и что сервер задыхается). Ниже приведен пример запроса сырого мыла:Удаление разделов WS-Addressing/WS-Security из запроса клиента WSE 3.0

<?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> 

Но я не забочусь о том, что WS-адресации/материала WS-Security. Я не сделал ничего, чтобы включить его. По-видимому, пакет .NET WSE 3.0 добавляет их по умолчанию. Есть ли способ избавиться от них? Я не вижу никаких свойств на моем объекте прокси, которые позволяют мне удалить эти разделы. Я пробовал:

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

Это вызывает исключение для ссылки на null при вызове метода моей веб-службы.

Я хочу, чтобы запрос SOAP, чтобы выглядеть следующим образом:

<?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> 

Заранее спасибо

+0

Это может помочь: http://blogs.msdn.com/b/dhrubach/archive/2008/06/16/modifying-the-security-header-generated-by-wse-runtime.aspx –

+0

Если вы используя WCF, тогда этот вопрос SO может помочь вам http://stackoverflow.com/questions/24635950/remove-timestamp-element-from-ws-security-headers-created-by-wcf – Ruskin

ответ

3

Ну, я в конечном итоге, используя технику, которую я использовал в прошлом. Я создал классы, которые реализуют SoapFilter и PolicyAssertion, которые позволяют мне модифицировать необработанный XML-запрос SOAP до его отправки. Ниже приведен пример:

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

Затем в застройщик вашего прокси веб-службы в применении политики:

/// <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); 
     } 
    } 
0

Интересно, если ваша проблема не также бен решить, просто не используя WSE?

+1

Поверьте, если бы я мог. Проблема в том, что мне нужна поддержка MTOM, а для .NET 2.0 это только с WSE (насколько я могу судить) –

0

Основываясь на ответе на этой странице, я добавил код ниже, чтобы удалить конкретный заголовок (по тэгам) рекурсивно из 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 
0

Я нашел самый простой способ удалить эти адресации и безопасности заголовков было изменить конфигурацию веб-службы для использования BasicHttpBinding вместо WSHttp binding.

1

, чтобы удалить заголовок адресации, я использовал приведенный ниже код в одном из моих приложений.

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

    } 

Я использовал SecureMessage функцию, потому что я хотел бы добавить маркеры безопасности, но и тот же код может быть использован в ProcessMessage функции.