从WSE 3.0客户端请求中删除WS-Addressing / WS-Security部分

我有一个简单的C#Web服务代理类,我用WSDL.exe创建。 我在远程Web服务上调用一个方法,它包含了一堆我不想要的WS-Addressing和WS-Security头文件(并且服务器正在阻塞)。 以下是原始肥皂请求的示例:

    urn:uuid:22f12267-b162-4703-a451-2d1c5c5a619b http://example.com/wstest   2009-04-15T16:27:25Z 2009-04-15T16:32:25Z      blah blah2    

我不关心WS-Addressing / WS-Security的东西 。 我没有做任何事情来包括它。 .NET WSE 3.0软件包似乎默认添加它们。 有没有办法摆脱这些? 我在代理对象上看不到允许我删除这些部分的属性。 我试过了:

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

当我调用我的Web服务方法时,这些会导致空引用exception。

我希望SOAP请求看起来像这样:

       blah blah2    

提前致谢

好吧,我最后使用的是过去使用的技术。 我创建了实现SoapFilterPolicyAssertion的类,它允许我在发送之前修改SOAP请求的原始XML。 以下是一个例子:

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

然后在您的Web服务代理的构造函数中应用策略:

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

删除寻址标头我在我的一个应用程序中使用了以下代码。

  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函数中可以使用相同的代码。

我想知道你的问题是否也可能因为不使用WSE而得到解决?

基于此页面中的答案,我添加了下面的代码,以便从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 

我发现删除这些寻址和安全标头的最简单方法是更改​​Web服务配置以使用BasicHttpBinding而不是WSHttp binding