c# - 在不使用服务引用的情况下手动创建 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>
从那里我假设我会收到一个我可以解析并继续我的生活的请求。这或多或少是对的吗?
如果有人对此有任何见解或可能有帮助的资源,我将不胜感激!
解决方案
推荐阅读
- css - 字体大小的 CSS clamp() 公式
- reactjs - 'void' 类型的参数不能分配给 'SetStateAction | 类型的参数 不明确的'
- python - 如何提高 pyglet 媒体的加载速度
- php - 如何修复 - Illuminate\Database\Eloquent\Collection {#440 ▼ #items: [] }
- javascript - Typescript 从接近当前时间的数组时隙中获取两个时隙
- python - DNA 到蛋白质 Python 功能
- android - 与元素类型“html”关联的属性名称“devsite”必须后跟“=”字符
- mysql - 使用 CONCAT() AS column_name 到 WHERE 子句
- excel - 使用登录 MSXML2.XMLHTTP60 进行 Web 抓取
- oauth-2.0 - 为外部 API 生成访问令牌以使用 firebase 函数