c# - 在发送之前检查 HttpRequestMessage

标签 c# .net amazon-web-services httpclient

我的任务是与 Amazon Gift Codes On Demand (AGCOD) 集成RESTful API。我们需要使用 Signature Version 4 签署我们的请求,由他们的 AWS SDK for .NET 执行的操作适用于其他服务,但不适用于 AGCOD。

我正在使用HttpClient来自 System.Net.Http 的类(class)命名空间与 AWS 的 API 进行通信。这又使用 HttpClientHandler创建 HttpRequestMessage 。这样,额外的 header (如 HostContent-LengthConnection)就会添加到消息中。

我的问题是,在调用 PostAsync 后如何检查消息?并且 header 已添加,但在将其发送到服务器之前,以便我可以计算并添加签名?

我显然可以简单地自己指定这些 header 。但这仅对已知 header 有帮助。如果不同HttpMessageHandler使用(例如 WebRequestHandler ),则可以添加不同的 header (例如 Content-EncodingCache-Control)。如果我不知道消息中的所有 header ,我将无法计算正确的签名。

最佳答案

大多数(可能是全部)AWS 服务实际上并不要求您包含所有 header 。亚马逊显然预计这会出现问题,原因正是您提到的。

The canonical headers consist of a list of all the HTTP headers that you are including that are part of the AWS request. As a minimum you must include host header, and different services might require other headers. [emphasis added]

http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

通常,您需要添加的 header 是您在应用程序级别已经了解的 header ,例如任何特定于服务的 x-amz-* header 。您无需担心包含的 header 示例包括 User-Agent:。 http 客户端库经常添加的 header 是 Date: header ,但如果您包含格式正确的 x-amz-date: header ,且其日期与您使用的日期相同要计算签名,验证签名时将忽略实际的 Date: header ,并使用您的替代 header 。

我意识到这并不能直接回答您的问题,但我怀疑您预计需要做的事情可能很乏味或不切实际,所以我认为这个信息值得一提。

关于c# - 在发送之前检查 HttpRequestMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849595/

相关文章:

c# - 带桥接表的数据库优先,如何将其排除在模型之外

c# - 如何在C#中配置中间输出目录

未找到 MySQL\Workbench\ssh\known_hosts

java - 在java中实现流程图类型的工作流

c# - 简而言之,关于 Func<> 可以说些什么

c# - 是否可以列出我们所有的字符串变量名称和值

c# - 了解 WebClient UploadString() 与 UploadStringTaskAsync 的异步

.net - 中国文化资讯

.net - NUnit使用TestCase所需的清晰度

amazon-web-services - AWS CDK 中的 VPC 和 cfnVPC 有什么区别?