3

Amazon S3 バケット内の何かの URL を取得すると、最後に署名を追加して、ユーザーがオブジェクトを表示する権限を持っていることを確認でき、URL は次のようになります。

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Expires=1235241261&Signature= t5vFBWXaN0DvVaWfck9n2%2fmTzOU%3d

これらの URL は、S3 ライブラリから文字列オブジェクトとして返されていたので、そのように渡しました。最近、コードを FxCop で実行したところ、このUriクラスを使用して URL を渡すことが推奨されました。私は FxCos のアドバイスを受けて、URLstringプロパティをUriプロパティに変更しました。ずっと後になって、すべてのオブジェクトが正常にフェッチされているわけではないことに気付くまで、すべてが正常に機能しているように見えました。

この問題の原因は、UriクラスToString()関数がわずかに異なるバージョンの URL を返すことでした。

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Expires=1235241261&Signature= t5vFBWXaN0DvVaWfck9n2/mTzOU=

私の解決策は、クラスのOriginalStringプロパティを使用することでした。Uriしかし、これについては何かがおかしいと感じています.2つの質問があります.

  • FxCops のアドバイスを受けて、Uriクラスを使用する必要がありましたか?
  • Amazon は、URL が多くの手を通過する可能性があり、それらが完全に同じ状態で戻ってくることに依存していないことを認識する必要がありますか?

.Net Uri クラスを使用する場合、URL は常に有効であると確信できますが、より微妙な間違いを犯す可能性があるようです。

4

2 に答える 2

4

生の文字列の代わりに Uri クラスを使用することを FxCop が提案するのは間違いではありません。Uri クラスを使用すると、タイプ セーフといくつかの便利な解析メソッドが提供されます。

System.Uri は、クエリ文字列のエンコードとデコードを自動的に行います。その動作を予期していなかったようで、いくつかの問題が発生しました。HTTP 標準に従って、URI でどの文字をエスケープする必要があるかを確認することをお勧めします。

パーセント エンコーディングまたは URL エンコーディングについて詳しく説明しているウィキペディアの記事を次に示します。

あなたの特定の問題は、%2fスラッシュ/文字の URL のエスケープ シーケンスです。System.Uri クラスがそのシーケンスをデコードしました。

もちろん、System.Uri は完璧ではありません。Rick Strahl は最近、彼のブログで Uri 文字列エンコーディングのさまざまなオプションについて話しました。

于 2009-02-21T18:59:12.510 に答える
4

私はdthrasherに同意します。FxCop は間違っていませんでした。しかし、FxCop が教えてくれないのは、特に ASP.NET で System.Uri を使用するときに経験するかもしれない苦痛です。このクラスを使用するための準備を整えるのに役立つ記事を書きましたが、やや混乱する可能性があります。

http://web.archive.org/web/20091015051451/http://www.pluralsight.com/community/blogs/keith/archive/2009/10/10/did-fxcop-tell-you-to-use-システム uri.aspx

于 2009-10-10T18:39:44.297 に答える