C#中使用SOAP API的难点

时间:2018-07-09 22:34:26

标签: c# xml soap

与我合作的公司提供SOAP API,以自动使用其服务。

API文档说“ API几乎是通用的 可接受:SOAP客户端可用于PHP,PERL,Python和Java。 但是,客户在集成到C#中时遇到了挑战 环境”

当我从SoapUI进行SOAP调用时,可以成功地通过API进行身份验证。但是,当我在Visual Studio中将WSDL文件作为C#中的服务引用链接时,我从API得到响应,但是身份验证始终失败。

身份验证操作采用3个参数:

<part name="salt" type="xsd:string"/>
<part name="token" type="xsd:string"/>
<part name="budgetID" type="xsd:string"/>

其中salt是随机字母或数字,tokensalt和我的密码的哈希,而budgetID是我的帐户的唯一标识符。

SoapUI进行以下调用,并具有我想要的确切结果:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:urn="urn:loginService">
      <soapenv:Header/>
      <soapenv:Body>
         <urn:doLogin soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <salt xsi:type="xsd:string">12</salt>
            <token xsi:type="xsd:string">ae4894ac690d70b0a3ebf27763</token>
            <budgetID xsi:type="xsd:string">6e080f339657ce5be68059bec9</budgetID>
         </urn:doLogin>
      </soapenv:Body>
    </soapenv:Envelope>

但是,当我使用链接的Service Reference在C#中使用类似的代码进行类似的调用时,会从API收到响应,但无法进行身份验证:

Random rnd = new Random();
int salt = rnd.Next(1, 10000);
string token;
string budgetKey = "XXX";
using(MD5 md5Hash = MD5.Create())
{
    token GetMD5Hash(md5Hash, (salt + txtBudgetPassword.Password).ToString());
}

//Instantiate the web services client created by my Service Reference
loginServicePortClient login = new loginServicePortClient();
Console.Write(login.doLogin(salt, token.ToString(), budgetKey));

.NET / C#SOAP客户端是否存在一些已知问题,无法在此客户端中使用完全相同的凭据?我知道MD5哈希值不是问题,因为该函数的输出就是我用来成功测试SoapUI中的调用的结果。

我很难相信没有办法在C#/。NET中使用此API。

API文档可用here

编辑:以下是SoapUI和C#调用的标头:

SoapUI:

POST /Budget/loginService.php HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "urn:loginService#loginService#doLogin"
Content-Length: 609
Host: api.textbroker.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

C#:

CONNECT api.textbroker.com:443 HTTP/1.1
Host: api.textbroker.com
Connection: Keep-Alive

1 个答案:

答案 0 :(得分:1)

很难说是怎么回事,但是我将首先使用提琴手检查肥皂包到API的途中,这将向您显示它是否格式错误或是否还有其他问题。