我试图用一个thridparty SOAP WSDL API来连接我的C#控制台应用程序,但是我无法让它工作。 我使用WSDL字符串连接到服务,作为Visual Studio中的服务资源:https://domain.tld/SimpleAPI/SimpleAPIService.svc?singleWsdl
文档说: 身份验证基于会话。请求者必须在每个请求的Authenticate字段中提供有效的会话令牌。会话可以访问与给定用户相同的资源和功能。要获取会话令牌,请使用GetSessionToken方法。要验证会话,请使用PingPong方法。 该文档侧重于REST API,这对我来说不是一个选项。连接的两种方法如下:
curl \ -H "Content-Type: application/json" \ -X POST -d '{ "username": "admin@domain.com", "password": "VerySecure123" }' \ https://domain.tld/SimpleAPI/SimpleAPIService.svc/rest/GetSessionToken
这应该返回如下内容:C9C5MlqrpMwG / 6bQ3mAVlm0Z6hi / eh1vsQs4i1I / g == 这部分没关系,我收到了一个令牌。但是,当我尝试使用PingPong方法时,我收到一条错误消息,指出它是一个错误的令牌或会话已过期。
curl \ -H "Content-Type: application/json" \ -H "Authenticate:CCPSessionId C9C5MlqrpMwG/6bQ3mAVlm0Z6hi/eh1vsQs4i1I/g==" \ -X POST -d '{}' \ https://domain.tld/SimpleAPI/SimpleAPIService.svc/rest/PingPong
我的代码如下:
static void Main(string[] args)
{
string apiUsername = "user";
string apiPassword = "pass";
using (var client = new acmp.SimpleAPIServiceClient())
{
client.ClientCredentials.UserName.UserName = apiUsername;
client.ClientCredentials.UserName.Password = apiPassword;
string token = client.GetSessionToken(apiUsername, apiPassword);
string tokenText = string.Format("CCPSessionId {0}", token);
using (OperationContextScope contextScope = new OperationContextScope(client.InnerChannel))
{
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[HttpRequestHeader.Authorization] = token; //tokenText
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
client.PingPong();
}
}
Console.WriteLine("End...");
Console.ReadLine();
}
现在的理论是我的脚本没有传递正确的标题。
请帮忙,我们花了很多时间调试。
答案 0 :(得分:0)
做了一点阅读,我无法在任何地方找到“CCPSessionsid”的令牌文本。
我看到“bearer”,token.AccessToken
遵循:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(“bearer”,token.AccessToken);
答案 1 :(得分:0)
在使用相同的API时,我也遇到了这个问题。删除字符串上的引号对我来说解决了这个问题。
request.Headers.TryAddWithoutValidation("Authenticate", token.Trim(new Char[] {'"'}));