2017-11-06 3 views
0

System.Web.HttpエンドポイントをIObservableにすることはできますか?それはRouteやAcceptVerbsのような属性を使っている間に行うことができますか?System.Web.HttpエンドポイントをIObservableにすることはできますか?

は基本的に、私は私が加入して反応性の拡張機能を経由して、それを処理していますので、IObservableストリームに次のコード例を作りたい:

[Route("{id}")] 
    [AcceptVerbs("GET")] 
    public async Task<IHttpActionResult> example(int id) 
    { 
     return Ok(await Service.GetExampleAsync(id)); 
    } 

編集:私のような、よりエレガントな解決策を探しています https://blogs.msdn.microsoft.com/jeffva/2010/09/15/rx-on-the-server-part-5-of-n-observable-asp-net(IHttpHandlerから観察可能)、7年後にはもっと成熟したほうがいいですか?

+0

私には分かりません。あなたはobservableを使ってすべてのリクエストを処理したいですか?あなたはどのように応答を返すべきかをどのように知っていますか? –

+0

あなたが本質的に要求から複数のイベントを取得し、複数のイベントを応答として生成しているこのケースでは、「すべてがストリームです」ということを確認しようとしています。応答側は、結果として得られる観測可能なストリームをただ購読することができます。 – Chip

答えて

2

直接的な方法はありません。しかし、自分でObservableを公開することもできます。主な問題は、example関数の値を返す必要があることです。

解決策の1つは、TaskCompletionSourceを渡すObservableを作成することです。これにより、イベントハンドラから結果を設定することができます。上記の例で

public class Request 
{ 
    public int Parameter { get; } 

    public Request(int parameter) 
    { 
     Parameter = parameter; 
    } 

    public TaskCompletionSource<IHttpActionResult> Result { get; } = new TaskCompletionSource<IHttpActionResult>(); 
} 

public class Handler 
{ 
    public Subject<Request> ExampleObservable { get; } = new Subject<Request>(); 

    [Route("{id}")] 
    [AcceptVerbs("GET")] 
    public async Task<IHttpActionResult> example(int id) 
    { 
     var req = new Request(id); 
     ExampleObservable.OnNext(req); 
     return await req.Result.Task; 
    } 
} 

、我々は、ExampleObservableRequestを押します。これを購読してRequest.Result.SetResult(...)を使用してリクエストを返すことができます。

ExampleObservable.Subscribe(req => req.Result.SetResult(Ok(Service.GetExample(id))); 
+0

あなたのソリューションをありがとう!私はこのソリューションにつきものになりました:https://blogs.msdn.microsoft.com/jeffva/2010/09/15/rx-on-the-server-part-5-of-n-observable-asp-net async httpハンドラの観察可能な実装です。私はこれが.netフレームワークライブラリの一部でなければならないと思うし、毎回自分自身を実装する必要はない。その執筆以来7年以上経っていますので、私は現在、よりエレガントで簡潔な最新の方法が何であるかを見極めようとしています。 – Chip

関連する問題