在不使用服务参考的情况下手动创建SOAP请求

时间:2018-12-11 21:06:29

标签: c# .net visual-studio soap visual-studio-2015

因此,我知道利用第三方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>

我假设我将从那里得到一个可以解析并继续生活的请求。这是差不多吗?

如果有人对此有所了解或有帮助的资源,我将非常感激!

0 个答案:

没有答案