4

クライアントからのパラメーターに基づいて応答構造をカスタマイズできるようにしたい API に取り組んでいます。応答フィルターは、各サービスまたはアクションでこれを回避するために、これを行うのに適した場所のようです。問題は、アクションによって返された応答 DTO にアクセスでき、そのプロパティを変更できる一方で、オブジェクトを完全に置き換える方法や場所が見つからないことです。

応答フィルターのオブジェクトを単純に置き換えることはできませんでしたが、これは私がやろうとしていることを説明するのに役立ちます:

public class ChangeResponseAttribute : ResponseFilterAttribute
{
    public override void Execute(IHttpRequest req, IHttpResponse res, object responseDto)
    {
        var overrideText = req.QueryString["override"];
        if (!String.IsNullOrEmpty(overrideText))
            responseDto = new { Message = overrideText };
    }
}

[ChangeResponse]
public class TodosService : Service
{
    public object Get(Todos request)
    {
        return new object[0];
    }
}

別のオプションとして、カスタム レスポンスを直接書き込んでリクエストを終了する方法があるように見えますが、それは ServiceStack によって残された他の処理をバイパスします。

応答フィルターよりもこれを行うのに適した場所はありますか? または、弾丸を噛んで各アクションで最適な DTO を返す必要がありますか?

4

1 に答える 1

4

フィルターで応答 DTO を変更することはできませんが、フィルター自体に応答を書き込むこともできます (これを行う方法の例については、この回答を参照してください)。

もう 1 つのオプションは、ServiceRunnerOnAfterExecute()を使用して、返された応答を変更できるカスタム フックをオーバーライドすることです。

public class MyServiceRunner<T> : ServiceRunner<T> 
{
    public override object OnAfterExecute(
        IRequestContext requestContext, object response) 
    {
        // Called just after any Action is executed
        var overrideText = req.Get<IHttpRequest>().QueryString["override"];
        return !string.IsNullOrEmpty(overrideText) 
            ? new { Message = overrideText } : null;
    }
}

CreateServiceRunnerServiceStack を使用するには、AppHostのメソッドをオーバーライドする必要があります。

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext)
{           
    return new MyServiceRunner<TRequest>(this, actionContext); 
}
于 2013-01-30T20:52:45.730 に答える