【问题标题】:Inspect HttpRequestMessage just before it is sent在发送之前检查 HttpRequestMessage
【发布时间】:2015-09-29 16:49:59
【问题描述】:

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

我正在使用 System.Net.Http 命名空间中的 HttpClient 类与 AWS 的 API 进行通信。这反过来又使用HttpClientHandler 创建HttpRequestMessage。这样会在邮件中添加额外的标头,例如 HostContent-LengthConnection

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

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

【问题讨论】:

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


    【解决方案1】:

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

    规范标头由作为 AWS 请求一部分的所有 HTTP 标头的列表组成,您正在包括。作为最低要求,您必须包含主机标头,并且不同的服务可能需要其他标头。 [强调]

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

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

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

    【讨论】:

    • 谢谢迈克尔,这让我前进了,很高兴接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2011-06-09
    相关资源
    最近更新 更多