Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# returning null on certain SOAP requests

Tags:

c#

soap

We have been battling with a SOAP related problem for some time. We have a SOAP based API that can be called from a number of languages (PHP, Ruby etc). C#, however, seems to choke in certain circumstances.

Unfortunately, it is not clear to us why it dies. We are not C# people, but we did get an external, C# person to look at the problem. And, they were also baffled!

The wdsl can be seen here: http://sandbox.knowledgetree.com/ktwebservice/webservice.php?wsdl (yes, its large).

From C#, session creation, and several other calls work happily. However, the get_folder_contents call fails. The call executes, and fiddler shows valid XML being returned. However, C#'s return value is null.

The request, per Fiddler, is as follows:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <s:get_folder_contents>
                <session_id xsi:type="xsd:string">or8llmjj5rm7co9h5p2k762s77</session_id>
                <folder_id xsi:type="xsd:int">99</folder_id>
                <depth xsi:type="xsd:int">1</depth>
                <what xsi:type="xsd:string">DFS</what>
            </s:get_folder_contents>
        </s:Body>
</s:Envelope>

(I've added spaces and line breaks to the fiddler logs).

The response, per Fiddler (but, again, formatted for clairty), is as follows:

    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns4="urn:KnowledgeTree" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <SOAP-ENV:Body>
            <SOAP-ENV:get_folder_contentsResponse>
                <item xsi:type="ns4:kt_folder_contents">
                    <status_code xsi:type="xsd:int">0</status_code>
                    <message xsi:type="xsd:string"></message>
                    <folder_id xsi:type="xsd:int">99</folder_id>
                    <folder_name xsi:type="xsd:string">Nic</folder_name>
                    <full_path xsi:type="xsd:string">Nic</full_path>
                    <items xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="ns4:kt_folder_item[0]" xsi:nil="true"/>
                </item>
            </SOAP-ENV:get_folder_contentsResponse>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

The (crude) C# application we used to test is as follows:

public partial class Form1 : Form
{
    private string _sessionId;

    private KnowledgeTreePortClient _webService;

    public Form1()
    {
        InitializeComponent();

        _webService = new KnowledgeTreePortClient();

        _webService.loginCompleted += new EventHandler<loginCompletedEventArgs>(WebLoginCompleted);
        _webService.loginAsync("username", "secret_password", "nil", "c-sharp-test");
    }

    private void WebLoginCompleted(object sender, loginCompletedEventArgs e)
    {
        _sessionId = e.Result.message;

        _webService.get_folder_contentsCompleted += GetFolderComplete;
        _webService.get_folder_contentsAsync(_sessionId, 99,1, "DFS");
    }

    private void GetFolderComplete(object sender, get_folder_contentsCompletedEventArgs e)
    {

    }
}

I'd prefer to fix this from the client (C#) side. But, any guidance as to what we are doing wrong would be much appreciated!

renen.

like image 228
renen Avatar asked Dec 20 '12 11:12

renen


1 Answers

I tried it and got the same response.

The way I resolved it and got the response you're looking for is by adding a web reference instead. To do this right click on the references folder of your project, select add service service reference, click on the web reference button on the bottom and then proceed from there.

The proxy classes generated by that method behave as you'd expect.

enter image description here

As to why the service reference is not working I'm still looking into that....

EDIT:

So I've check the response Xml against the WSDL and I cannot spot any namespace mismatches. I found a couple of articles detailing how to resolve sub elements (like arrays) being null which was mostly because of a namespace mismatch - but in your case the whole kt_folder_contents value is bull and as far as I can see the namespace (urn:KnowledgeTree) in the generated wrappers is correct.

I hope someone else can give a fix for this - else if the Web Reference generated proxy works for you...

like image 168
Quinton Bernhardt Avatar answered Oct 25 '22 14:10

Quinton Bernhardt