1

I am trying to use a third party soap based web service into my project. While sending manual soap requests via soap-ui, it is getting timed out but when i am adding check on enable ws-addressing through soap-ui, it works smoothly.

Now the issue is, i am unable to integrate this into my existing app as ws-addressing isn't enabled in code anywhere. Any suggestion on how this can be done?

Codebase is in c#

Damodaran
  • 10,882
  • 10
  • 60
  • 81
Hitesh
  • 147
  • 2
  • 16

1 Answers1

1

What makes a difference in SoapUI with "Enable/Disable WS-A addresing" checked or not is a <wsa:Action> tag added by default to the SOAP header.

If you use WCF, you can add WS-Addressing headers like specified in How do I use WS-Addressing in WCF and set the wsa:replyto header? and I would start from adding Action header.

EDIT: Knowing that SoapExtension class is used, here is a complete example of adding WS-Addressing Action header to the request sent by client:

public class WebServiceSOAPExtension : SoapExtension
{
    private Stream inwardStream;
    private Stream outwardStream;

    public override Stream ChainStream(Stream stream)
    {
        outwardStream = stream;
        inwardStream = new MemoryStream();
        return inwardStream;
    }

    public override object GetInitializer(Type serviceType)
    {
        return null;
    }

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return null;
    }

    public override void Initialize(object initializer)
    {
        return;
    }

    public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
    {
        switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                break;
            case SoapMessageStage.AfterDeserialize:
                break;
            case SoapMessageStage.BeforeDeserialize:
                RewriteResponse();
                break;
            case SoapMessageStage.AfterSerialize:
                RewriteRequest();
                break;
        }
    }

    private void RewriteResponse()
    {
        string message;
        var streamReader = new StreamReader(outwardStream);
        var streamWriter = new StreamWriter(inwardStream);
        message = streamReader.ReadToEnd();
        streamWriter.Write(message);
        streamWriter.Flush();
        inwardStream.Position = 0;
    }

    private void RewriteRequest()
    {
        string message;
        XmlDocument xmlDoc = new XmlDocument();
        inwardStream.Position = 0;
        var streamReader = new StreamReader(inwardStream);
        var streamWriter = new StreamWriter(outwardStream);
        message = streamReader.ReadToEnd();

        xmlDoc.LoadXml(message);
        var bodyNode = xmlDoc.GetElementsByTagName("Body", "http://www.w3.org/2003/05/soap-envelope/")[0];
        var headerNode = xmlDoc.CreateElement("s", "Header", "http://www.w3.org/2003/05/soap-envelope/");
        var actionNode = xmlDoc.CreateElement("wsa", "Action", "http://www.w3.org/2004/12/addressing");
        actionNode.InnerText = "http://sampleserver.example/Action";
        headerNode.AppendChild(actionNode);
        bodyNode.ParentNode.InsertBefore(headerNode, bodyNode);

        message = xmlDoc.InnerXml;
        streamWriter.Write(message);
        streamWriter.Flush();
    }
}

This class must be registered in client's web application:

<webServices>
  <soapExtensionTypes>
    <add type="WebApplication1.WebServiceSOAPExtension, WebApplication1" priority="1" group="Low" />
  </soapExtensionTypes>
</webServices>
Community
  • 1
  • 1
Konrad Kokosa
  • 16,563
  • 2
  • 36
  • 58
  • Thanks kkokosa for the information. Can you please suggest how to add tag to soap request while calling the request via web methods via SOAP extension class? which method is to be overridden for this purpose? – Hitesh Nov 05 '13 at 09:47