0

ActionResultが実際にいつ評価されるかについて少し混乱しています。

Authorize属性を使用すると、ユーザーが承認されていない場合、結果コンテキストが承認されていない結果に設定されることがわかります。

filterContext.Result = new HttpUnauthorizedResult();

ただし、AuthorizeAttributeはリダイレクトを実行せず、代わりに、何かが401ヘッダーに変換するまで、.NETパイプラインを「流れる」コンテキストを設定するだけです。

私の質問は、.Netで実際に変換が行われるのは何ですか?

4

2 に答える 2

2

ActionResult が実際にいつ評価されるかについて、私は少し混乱しています。

ActionResultは、 IResultFilter.OnResultExecutingの後、IResultFilter.OnResultExecutedの前に評価されます (HTTP 応答またはクライアントにフラッシュされません) 。

Authorize 属性で実証しているのはアクション フィルターであり、開発者はアクション フィルターのライフ サイクル内でアクションの結果を変更/変更できます。ここで Authorize 属性では、ユーザーが認証されていない場合、アクションの結果HttpUnauthorizedResultに変更しています。今、あなたが言っていることは

何かがそれを 401 ヘッダーに変換します

しかし、実際には ActionResult オブジェクトのインスタンス化中にレスポンス ヘッダー 401 を設定したのは HttpUnauthorizedResult です。ActionResult がインスタンス化されると、HTTP 応答パイプラインにフラッシュされます。

于 2013-03-19T07:49:45.513 に答える
1

少し掘り下げてみると、すべてのActionResultsが抽象クラスActionResultを継承していることがわかります。このクラスには、ExecuteResultという1つの抽象メソッドがあります。

public abstract class ActionResult
{
    public abstract void ExecuteResult(ControllerContext context);
}

各アクション結果が独自のロジックで実装するのはこのメソッドです。

したがって、たとえば、JsonResultはContentTypeを指定する必要があります。

response.ContentType = "application/json";

FileResultが「Content-Disposition」ヘッダーを設定している間:

context.HttpContext.Response.AddHeader("Content-Disposition", headerValue);
于 2013-03-18T23:35:06.643 に答える