【发布时间】:2016-03-09 09:55:20
【问题描述】:
我正在开发一个.NET 4.0 控制台应用程序作为SOAP Web Service 客户端,它将数据(POST)发送到第三方。我无法控制服务器端的 Web 服务。第三方确实提供了WSDL's 使用,我能够导入它们并以合理的成功使用它们。但是,需要使用 gzip 压缩请求消息,而我终其一生都无法弄清楚如何使用代理服务来做到这一点。
This topic 在这里,让我相信如果无法控制客户端和服务器代码,则无法压缩请求。作为这个发现的结果,我在我的应用程序中编写了代码以在XDocument 对象中手动创建SOAP XML;然后,填充来自WSDL 代理类对象的值,我之前编写了我的客户端应用程序以供使用。
此客户端的第一个要求是通过gzip 发送压缩消息。经过一些研究,我发现答案很简单,只需将HttpRequestHeader.AcceptEncoding, "gzip, deflate" 添加到请求标头即可。不幸的是,这样做似乎没有用。
目前,我正在检索的证书不是真正的证书。在部署到测试环境进行实际服务测试之前,我正在尝试使代码尽可能合理。
- 有没有办法通过代理调用(
wsdl)压缩请求? - 为了正确压缩
HttpWebRequest,我是否遗漏了什么? - 是否有其他问题会导致返回错误消息?
如果请求本身正常,我预计会出现与身份验证无效有关的不同消息。 - 有没有办法通过
app.config进行压缩?
我对如何处理/做什么有点困惑。假设我已经将请求的ContentType 设置为,我应该如何(以及)添加什么以便将content-transfer-encoding 添加到请求中?如果ContentType 不正确,我应该如何添加此信息?
带有 MTOM 编码附件的 SOAP Evenlope 的内容类型必须是“application/xop+xml”,并且内容传输编码必须是 8 位。
我已经对下面的代码进行了几次迭代,但是,我相信相关的 sn-ps 是最简单形式的代码。如果还有其他有用的信息,请告诉我。
HttpWebRequest的创建方法:
private static HttpWebRequest CreateWebRequest(SoapAction action)
{
string url = GetUrlAddress(action);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Headers.Add("SOAPAction", action.ToString());
request.ContentType = "application/xop+xml";
request.Accept = "text/xml";
request.Method = "POST";
request.ClientCertificates.Add(/* Retrieve X509Certificate Object*/);
return request;
}
发送请求的代码:
using (Stream stream = request.GetRequestStream())
{
soapXml.Save(stream);
}
检索响应的代码:
这就是我检索正在发生的错误消息的方式
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader reader = new StreamReader(response, Encoding.Default))
{
File.AppendAllText(filePath, response.Headers.ToString());
File.AppendAllText(filePath, reader.ReadToEnd());
}
}
}
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
}
收到错误消息:
必须使用 HTTP 压缩 (RFC 1952 - GZIP) 发送请求消息。
【问题讨论】:
标签: c# soap gzip soap-client irs