- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 C# 构建一个应用程序,该应用程序使用 AWS SDK 将文件上传到 S3。
但是,我有一些用户在应用程序尝试上传文件时收到“请求时间太偏斜”错误。
我知道问题是用户的时钟不同步,但是,很难指望用户更改它,所以我想知道,是否有任何方法可以避免发生此错误(任何 .NET使用 NTP 或类似工具获得准确时间的功能?)
在我用来上传文件的当前代码下方。
var _s3Config = new AmazonS3Config { ServiceURL = "https://s3-eu-west-1.amazonaws.com" };
var _awsCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken);
var s3Client = new AmazonS3Client(_awsCredentials, _s3Config);
var putRequest = new PutObjectRequest
{
BucketName = "my.bucket.name",
Key = "/path/to/file.txt",
FilePath = "/path/to/local/file.txt"
};
putRequest.StreamTransferProgress += OnUploadProgress;
var response = await s3Client.PutObjectAsync(putRequest);
最佳答案
从时间服务器获取时间实际上是您挑战中比较容易的部分。据我所知,没有内置的 C# 功能可以从时间服务器获取准确的时间,但快速搜索会为 NTP 客户端生成大量示例代码。我在 dotnet-snippets.com 上找到了一个很好的综合示例(对于您的案例来说可能有点矫枉过正),并且在标题为“How to Query an NTP Server using C#?”的页面中的 Stack Overflow 上找到了一个非常精简的版本.后者看起来对您的情况可能有效,因为您所需要的只是对当前时间的合理准确的了解。
现在开始真正的挑战:将这段时间用于 Amazon S3。首先,介绍一些背景知识,因为理解为什么会发生这种情况很重要。时间偏差限制旨在防止重放攻击,如下所述: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
因此,亚马逊在构造 HTTP(S) 请求时将当前时间戳构建到 AWS SDK 中使用的身份验证签名中。但是,SDK 始终使用当前时间(无法在 SDK 方法中覆盖它): https://github.com/aws/aws-sdk-net/blob/master/AWSSDK_DotNet35/Amazon.Runtime/Internal/Auth/AWS3Signer.cs#L119
请注意,在所有情况下,开发工具包都使用 AWSSDKUtils.FormattedCurrentTimestampRFC822 作为时间戳,调用方无法将不同的值传递给方法。
所以这给你留下了两个我可以看到的选项:
绕过 Amazon SDK 并使用您从 NTP 服务器检索的时间构建您自己的 HTTP 请求。这是可行的,但并不容易。亚马逊不鼓励这种方法,因为 SDK 提供了很多有用的包装器来确保您正确地使用 API 作为一个整体,处理大量繁琐的消息处理,如果您直接使用 HTTP,则必须自己完成这些处理。它还有助于处理大量错误,并确保在传输中断时正确清理内容。
克隆 Amazon SDK git 存储库并创建您自己的分支并进行修改以允许您传入当前时间。这也很困难,因为您必须想出一种方法将时间向下传递到多个 API 对象层。而且您将失去在新 SDK 可用时轻松更新到新 SDK 的好处。
抱歉,没有简单的答案,但我希望这对您有所帮助。
关于c# - S3 请求时间太偏斜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001165/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!