使用 gzip 压缩 HttpWebRequest

2023-12-14

我正在开发一个.NET 4.0控制台应用程序充当SOAP Web Service客户端将数据发送(POST)到第三方。我无法控制服务器端的网络服务。第三方确实提供了WSDL's使用,并且我能够导入它们并以相当成功的方式使用它们。但是,需要使用压缩请求消息gzip,我一生都无法弄清楚如何使用代理服务来做到这一点。

这个话题SO,让我相信如果无法控制客户端和服务器代码,则无法压缩请求。由于这一发现,我在应用程序中编写了代码来手动创建SOAP XML in a XDocument目的;然后,填充来自WSDL我之前编写的客户端应用程序要使用的代理类对象。

该客户端的第一个要求是通过以下方式发送压缩消息gzip。经过一些研究,我发现答案很简单,只需添加HttpRequestHeader.AcceptEncoding, "gzip, deflate"到请求头。不幸的是,这样做似乎并没有奏效。

目前,我检索的证书不是真正的证书。在部署到测试环境进行实际的服务测试之前,我试图使代码尽可能健全。

  1. 有没有办法通过代理调用压缩请求(wsdl)?
  2. 为了正确压缩我是否缺少一些东西HttpWebRequest?
  3. 是否可能还有其他问题导致返回错误消息?
    如果请求本身正常,我希望出现与身份验证无效相关的不同消息.
  4. 有没有一种方法可以通过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)发送。


我认为我能够通过将以下内容添加到解决压缩错误消息HttpWebRequest method:

request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); 

更新了创建 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(HttpRequestHeader.ContentEncoding, "gzip"); 
    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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gzip 压缩 HttpWebRequest 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • MySql、Postgres、Oracle 和 SQLServer 忽略 IS NOT NULL 过滤器

    当我准备回答 SO 上的一位同事时 我遇到了一种奇怪的情况 至少对我来说是这样 原来的问题在这里 数据透视表忽略具有空值的行 我已经修改了查询以使用max代替group concat为了显示所有数据库中的 问题 SELECT id max
  • 调用 SendMessage (P/Invoke) 不断崩溃

    我必须编写一个与第三方程序通信的应用程序 AOL 对不起 做了很多研究 我发现了一些方法来做到这一点P Invoke 并且在很大程度上它works好的 但它会在后续试验中崩溃 特别是SendMessage 我在下面概述了崩溃的代码 所有这些
  • 动态设置复选框的初始值

    我有一个带有 CheckboxSelectMutliple 小部件的 MultipleChoiceField weight training days forms MultipleChoiceField help text u Requir
  • 如何使用 java.util.Scanner 正确读取 System.in 中的用户输入并对其进行操作?

    这本来是一个规范问题 答案可以用作 重复目标 这些要求基于最常见的 每天都会发布问题 并可根据需要添加 他们都 需要相同的基本代码结构来实现每个场景 他们通常是相互依赖的 扫描仪似乎是一个 simple 要使用的类 这就是犯第一个错误的地方
  • 如何在命令行上使用和运行 Swift 2.3

    如何在命令行上启动 Swift 如何使用 Swift 2 3 在命令行上编译文件 自从我更新到 Xcode 8 后 我默认得到 Swift 3 xcrun swift Welcome to Apple Swift version 3 0 s
  • Chrome 不渲染通过 元素引用的 SVG

    我遇到了 google chrome 无法渲染 svg 的问题img元素 刷新页面和初始页面加载时会发生这种情况 我可以通过 检查元素 来显示图像 然后右键单击 svg 文件并在新选项卡中打开 svg 文件 然后 svg 图像将呈现在原始页
  • Android 应用程序无法在模拟器上启动

    我正在测试一个简单的 hello 应用程序 但它没有在模拟器上启动 没有错误 控制台是这样的 2010 11 16 21 26 06 Hello World 2010 11 16 21 26 06 Hello World Android L
  • C# 静态成员“继承”——为什么它存在?

    在 C 中 超类的静态成员被 继承 到子类范围中 例如 class A public static int M return 1 class B A class C A public new static int M return 2 A
  • 在 Silverlight 中获取 MAC 地址

    是否可以从 Silverlight 应用程序获取客户端的 MAC 地址 如果该解决方案也适用于 OOB 那就太理想了 不可以 在 Silverlight 2 或 Silverlight 3 中无法获取客户端的 MAC 地址 对此没有 p i
  • 如何使用另一个数组按键过滤数组

    我现在在我的项目上工作了几个小时 我有一些来自早期数组的键 我想循环到我的新数组并选择我从早期数组中拥有的键的值 早期阵列 old keys key1 key2 key3 新数组 result key1 gt foo key2 gt bar
  • APK 大小 V/S 安装的 APP 大小

    我是 Flutter 和 dart 语言的新手 在开发了一些示例应用程序后 从教程中看到 我发现简单的选项卡布局应用程序在发布后 APK 占用 7MB 安装应用程序后大小为 27MB 我的问题如下 APK 大小和安装的应用程序大小有什么区别
  • 通过java进行scp传输

    通过 Java 编程语言执行 scp 传输的最佳方法是什么 看来我可以通过 JSSE JSch 或 bouncy castle java 库来执行此操作 这些解决方案似乎都没有一个简单的答案 我最终使用了Jsch 它非常简单 并且似乎可以很
  • 有没有办法在张量流Python神经网络中创建我自己的数据集?

    我试图弄清楚如何根据我想要做的事情来训练我的神经网络 目前我正在使用 mnist npz 数据集 该数据集通过识别数字来训练神经网络 我想切换到我自己的数据集 但不知道如何切换 我尝试了不同的方法 但它们都不适合我自己 我的训练准备代码目前
  • Android 应用程序中的 Retrofit Adapter 保存在哪里?

    我不清楚 Refrofit 适配器和 API 类应该保存在 Android 中的哪里 我应该使用 Application 类还是 Singleton 来保留适配器 API接口类怎么样 RestAdapter myRestAdapter wh
  • 为什么 form.reset() 在此页面回发后不起作用?

    我班上的一位学生引起了我的注意 但我对此没有任何解释 而且在搜索后我也找不到任何解释 点击提交按钮后 重置按钮不起作用 就好像如果通过 post 请求请求资源 浏览器会阻止重置
  • 使 Emacs 对缩进不那么激进

    每当我键入某些内容 例如 时 Emacs 都会重新缩进当前行 或者 这非常烦人 因为有很多地方它不够智能 无法正确缩进 如何禁用此功能 我仍然希望能够使用 TAB 缩进该行 但我不希望我输入的任何源代码导致它重新缩进 我使用的是 Dylan
  • 加载所有图像(包括缓存图像)后的 jquery 事件?

    我有以下功能 用于在页面中使用ajax 并且仅在加载所有图像后才显示它 get target page php function data var live preview temp holder html data var imgCoun
  • ApplicationServices 解析网络核心中不同范围的实例?

    我使用 net core 3 1 进行以下配置 public interface IFoo public void Work public class Foo IFoo readonly string MyGuid public Foo M
  • 无法开始分布式事务

    我尝试对链接服务器运行 SQL 但出现以下错误 BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 FROM Sessions OLE DB provider SQLNCLI for linked serv
  • 使用 gzip 压缩 HttpWebRequest

    我正在开发一个 NET 4 0控制台应用程序充当SOAP Web Service客户端将数据发送 POST 到第三方 我无法控制服务器端的网络服务 第三方确实提供了WSDL s使用 并且我能够导入它们并以相当成功的方式使用它们 但是 需要使