与我合作的公司提供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
是随机字母或数字,token
是salt
和我的密码的哈希,而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
答案 0 :(得分:1)
很难说是怎么回事,但是我将首先使用提琴手检查肥皂包到API的途中,这将向您显示它是否格式错误或是否还有其他问题。