Your solution should consist of those four steps:
a) Define classes for each WS-Addressing field, like:
public class AddressingHeader : SoapHeader
{
public AddressingHeader()
: base() { }
[XmlElement("Action")]
public string Action
{
get; set;
}
}
b) Define a Soap Extension to add those headers to the Soap Envelope:
public class AddressingExtension : SoapExtension
{
public AddressingExtension()
: base() { }
public override object GetInitializer(Type serviceType)
{
return null;
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
AddAddressingHeaders(message);
break;
default:
break;
}
}
private void AddAddressingHeaders(SoapMessage message)
{
message.Headers.Add(new AddressingHeader());
}
}
c) define a Soap Extension Attribute to mark web methods of your choice:
[AttributeUsage(AttributeTargets.Method)]
public class AddressingExtensionAttribute : SoapExtensionAttribute
{
private string action;
private int priority;
public AddressingExtensionAttribute()
: base()
{
this.action = "defaultaction";
}
public override Type ExtensionType
{
get
{
return typeof(AddressingExtension);
}
}
public override int Priority
{
get
{
return priority;
}
set
{
priority = value;
}
}
public string Action
{
get
{
return action;
}
set
{
action = value;
}
}
}
d) Unfortunatelly, you will have to modify auto-generated proxy class, to use above attribute, for example:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(...)]
[WebApplication1.AddressingExtension(Action = "http://some.example/DoWork")]
public void DoWork(...) {
...
}