0

ExceptionInterceptor操作の呼び出しをtry/でラップして、catch例外処理を集中化する を作成しました。私がやりたいことは、HTTPステータスコードの処理を一元化することですが、.NETからHTTPステータスコードを設定できないようですIOperationInterceptor. 私のインターセプターはICommunicationContext依存関係を取り、それOperationResultを egOperationResult.BadRequestに設定しますが、OpenRasta はまだログに次のように書き込みます:

Step into: Stepping over non-user code 'OpenRasta.Pipeline.PipelineRunner.RunCallGraph'
    38-[2011-07-08 09:11:37Z] Start(1) Entering PipelineRunner: Executing contributor OperationResultInvokerContributor.RunOperationResult
        38-[2011-07-08 09:11:37Z] Information(0) Executing OperationResult OperationResult: type=OK, statusCode=200.

また、明示的に設定しようとしましIResponse.StatusCodeたが、効果はありません。応答したい ResponseResource は有効なリソースが登録されているためResourceSpace(URI はありませんが)、ステータス コードは無視され、通常のレンダリング パイプラインは「これで問題ありません」と考えて先に進みます。

OpenRasta が StatusCode を無視するのはなぜですか?

4

1 に答える 1

1

さらに掘り下げた後、HTTPステータスコードを直接オーバーライドできないことがわかりましたIOperationInterceptor. ICommunicationContext.PipelineData代わりに、実装で意味のある場所からコレクションに必要なデータを格納する必要がありますIOperationInterceptor。たとえば、次のBeforeExecute実装があります。

public bool BeforeExecute(IOperation operation)
{
    if (operation.Inputs.Count() > 0)
        this.inputMember = operation.Inputs.First();

    return true;
}

inputMember を設定するとBeforeExecute、エンティティ (HTTP POST または PUT 経由で受信) を取得したり、メソッドthis.inputMember.Binder.BuildObject().Instanceで new を生成したりできます。OutputMemberRewriteOperation

必要なすべてのデータを内部に保存したら、保存されたICommunicationContext.PipelineDataデータを処理し、それに応じてIPipelineContributor実装内で応答できます。After<KnownStages.IOperationExecution>()これを行うには、次のようにイベントをサブスクライブします。

public void Initialize(IPipeline pipelineRunner)
{
    pipelineRunner
        .Notify(RenderOnException)
        .After<KnownStages.IOperationExecution>();
}

メソッドは次のRenderOnExceptionようになります。

private static PipelineContinuation RenderOnException(ICommunicationContext context)
{
    if (!context.PipelineData.ContainsKey(ExceptionInterceptor.Key))
        return PipelineContinuation.Continue;

    var interestingDataStoredByTheOperationInterceptorImplementation =
        context.PipelineData["SomeKey"];

    // Set context.OperationResult to something meaningful.

    // Instruct the pipeline to render now
    return PipelineContinuation.RenderNow;
}

これはこれを実装するための最良の方法ではないかもしれませんが、機能し、個々の Handler メソッドを薄くして、解決しようとしている問題に集中させることになります。OperationResults left と rightを返す代わりに、Handler メソッドは、IOperationInterceptor実装がキャッチする通常の例外をスローできるようになり、実装が適切な応答で をIPipelineContributorオーバーライドできるようになりました。OperationResult

于 2011-07-15T13:10:34.817 に答える