首页 > 解决方案 > 在不使用服务引用的情况下手动创建 SOAP 请求

问题描述

所以我知道使用第三方 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>

从那里我假设我会收到一个我可以解析并继续我的生活的请求。这或多或少是对的吗?

如果有人对此有任何见解或可能有帮助的资源,我将不胜感激!

标签: c#.netvisual-studiosoapvisual-studio-2015

解决方案


推荐阅读