在HttpRequestMessage发送之前检查它

本文关键字:检查 HttpRequestMessage | 更新日期: 2023-09-27 18:15:00

我的任务是与Amazon Gift Codes On Demand (AGCOD) RESTful API集成。我们需要使用签名版本4来签署我们的请求,这是由他们的AWS SDK为。net为其他服务执行的,但不是AGCOD。

我正在使用System.Net.Http命名空间中的HttpClient类与AWS的API通信。这反过来使用HttpClientHandler来创建一个HttpRequestMessage。在这样做额外的头,如Host, Content-LengthConnection被添加到消息。

我的问题是,我如何去检查消息后,我已经调用了PostAsync和头部已添加,但在它被发送到服务器,所以我可以计算和添加签名?

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

在HttpRequestMessage发送之前检查它

大多数AWS服务实际上并不要求您包含所有标头。亚马逊显然预料到这将是一个问题,正是因为你提到的原因。

规范标头由所有HTTP标头的列表组成,这些标头是AWS请求的一部分。至少你必须包含主机头,不同的服务可能需要其他的头。(重点补充道)

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

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

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