在Visual Studio C#中连接到SOAP WSDL

时间:2016-08-26 16:39:48

标签: c# web-services soap wsdl

我试图用一个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();
        }

现在的理论是我的脚本没有传递正确的标题。

请帮忙,我们花了很多时间调试。

2 个答案:

答案 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[] {'"'}));