因此,我知道利用第三方Web服务时的标准建议是添加服务引用并创建/使用生成的代理类。
我实际上已经做到了,并且在大多数情况下都可以正常工作。我所遇到的问题更具体地涉及在另一端建立事物的方式。
我需要经历的过程本质上是: Login -> GetNumber
现在我可以成功登录,但是一旦我尝试调用 GetNumber ,我就会收到响应,说“登录上下文为NULL”。这是他们的消息,是由于会话内存立即丢失的结果。
需要为所有请求维护一个会话cookie,但是为其SOAP服务生成的代理无法访问该cookie。之所以无法访问该cookie,是因为他们选择了使用SOAP传输将一段数据传递回调用方。
因此,这使我处境艰难。我可以让他们在端头进行更改(可能,但仅在某种程度上),或者只是不使用生成的代码并手动构建SOAP请求。
问题在于,我很难找到有关如何手动构建请求的任何信息,因为任何时候有人问如何做到这一点,他们得到的建议就是添加服务引用并以这种方式进行操作。
截至目前,我有:
var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler()
{
CookieContainer = cookieContainer
};
var client = new HttpClient(handler);
我希望用于存储以下请求的会话cookie。
然后我开始尝试构建请求的标头,例如:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("their end point");
request.Method = "POST";
request.Headers.Add("SOAPAction: \"\" ");
request.ContentType = "text/xml; charset=utf-8";
但是感觉不太正确。最终,我想要的是这样的请求:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<login>
<userId>coolUserId</userId>
<password>coolPassword</password>
</login>
</soap:Body>
</soap:Envelope>
我假设我将从那里得到一个可以解析并继续生活的请求。这是差不多吗?
如果有人对此有所了解或有帮助的资源,我将非常感激!