我正在开发一个.NET 4.0
控制台应用程序充当SOAP Web Service
客户端将数据发送(POST)到第三方。我无法控制服务器端的网络服务。第三方确实提供了WSDL's
使用,并且我能够导入它们并以相当成功的方式使用它们。但是,需要使用压缩请求消息gzip
,我一生都无法弄清楚如何使用代理服务来做到这一点。
这个话题SO,让我相信如果无法控制客户端和服务器代码,则无法压缩请求。由于这一发现,我在应用程序中编写了代码来手动创建SOAP XML
in a XDocument
目的;然后,填充来自WSDL
我之前编写的客户端应用程序要使用的代理类对象。
该客户端的第一个要求是通过以下方式发送压缩消息gzip
。经过一些研究,我发现答案很简单,只需添加HttpRequestHeader.AcceptEncoding, "gzip, deflate"
到请求头。不幸的是,这样做似乎并没有奏效。
目前,我检索的证书不是真正的证书。在部署到测试环境进行实际的服务测试之前,我试图使代码尽可能健全。
- 有没有办法通过代理调用压缩请求(
wsdl
)?
- 为了正确压缩我是否缺少一些东西
HttpWebRequest
?
- 是否可能还有其他问题导致返回错误消息?
如果请求本身正常,我希望出现与身份验证无效相关的不同消息.
- 有没有一种方法可以通过
app.config
?
下一组要求我对如何处理/做什么有点困惑。假设我已经设置了ContentType
请求的内容,我该如何添加(以及添加什么内容)以添加content-transfer-encoding
件的要求?如果ContentType
不正确,我应该如何添加这些信息?
带有 MTOM 编码附件的 SOAP Evenlope 的内容类型必须是“application/xop+xml”,并且内容传输编码必须是 8 位。
我已经对下面的代码进行了几次迭代,但是,我相信相关片段是最简单形式的代码。如果还有其他有用的信息,请告诉我。
创建 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)发送。