0

IIS 7 Web サイト インスタンスで実行されている WCF REST サービスをまとめており、トークンと HMAC を Authentication ヘッダーに挿入するHMAC認証スキームを使用しています。典型的なリクエストのヘッダー リストの例は、次のようになります。

GET http://api.mydomain.com/Contacts HTTP/1.1
Authorization: 774F035C-FRTB-4207-DDDD-31BF1534AD96:9h0Whke9Bgi3XSHPo/YSXw==
Content-Type: application/xml; charset=utf-8
Host: api.mydomain.com
Connection: Keep-Alive

.svc ファイルの代わりにルーティングを使用してサービスをセットアップしたので、Global.asax は次のようになります。

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("Users", new WebServiceHostFactory(), typeof(UsersService)));
        RouteTable.Routes.Add(new ServiceRoute("Widgets", new WebServiceHostFactory(), typeof(WidgetsService)));
    }

問題は、サービスがそのようなルーティングで宣言されている場合、IISが末尾のスラッシュのないWebGeturiへの呼び出しを受信すると末尾のスラッシュのある uri への 307 リダイレクトを行うことです。役に立つと思いますが、問題は、リダイレクトが Authorization ヘッダーをダンプすることです。

私のサービスクラスはすべてコーシャであり、他のすべての点でうまく機能します. リダイレクトが発生した場合にその Authorization ヘッダーを維持できるようにする方法はありますか? 解決策はIISの構成になると思いますが、スラッシュなしのバージョンのURIを取得するために、あらゆる種類のルーティングハックを配置できると思います。

更新:この動作を検証するこの記事
を見つけましたが、実際には修正されていません。

4

1 に答える 1

0

したがって、IIS がここで問題に巻き込まれている理由は完全にはわかりません。「Authorization ヘッダーをダンプする」とはどういう意味ですか? リダイレクトの一部として再送信しているということですか、それとも送信していないということですか?

WCFに関しては、おそらくリダイレ​​クトが起こらないようにすることができます。これは、Microsoft の誰かを平手打ちしたくなるようなことの 1 つです。クラス自体には、適切な名前のプロパティUriTemplateを介して末尾のスラッシュを無視する機能があります。残念ながら、WCF属性は実際にはこのプロパティをまったくマップしないため、プロパティに入力したものに正確にバインドされるテンプレートを常に作成します。IgnoreTrailingSlashWebInvoke/GetUriTemplate

したがって、私が認める厄介な最も簡単な回避策は、末尾にスラッシュがある 2 番目の署名で WCF コントラクトのメソッドをオーバーロードすることです。例えば:

[OperationContract]
[WebGet(UriTemplate="/Users")]
public List<User> GetUsers()
{
   .... some code here ...
}

[OperationContract]
[WebGet(UriTemplate="/Users/")]
public List<User> GetUsersSlash()
{
   return this.GetUsers();
}

ばかげていますよね?これが何度も繰り返したいパターンの場合は特に悪い. そのため、ややハッキーではないもう 1 つのオプションは、カスタム動作を介してサービスに適用するカスタム操作セレクター ロジックを記述することです。これを行う方法の詳細については、この StackOverflow answerを参照してください。

于 2011-08-08T20:11:57.670 に答える