Может ли конечная точка System.Web.Http быть IObservable?

Может ли конечная точка System.Web.Http быть IObservable? Можно ли это сделать при использовании таких атрибутов, как Route и AcceptVerbs?

По сути, я хочу превратить следующий пример кода в поток 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), но, надеюсь, более зрелый после семи лет?

1 ответ

Прямого пути нет. Но вы могли бы опубликовать свой собственный Observable, Основная проблема заключается в том, что вам нужно вернуть значение в example функция.

Одним из решений может быть создание Observable, в котором вы передаете TaskCompletionSource, Это позволит вам установить результат из обработчика событий.

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;
    }
}

В приведенном выше примере мы нажимаем Request в ExampleObservable, Вы можете подписаться на это и использовать Request.Result.SetResult(...) вернуть запрос.

ExampleObservable.Subscribe(req => req.Result.SetResult(Ok(Service.GetExample(id)));
Другие вопросы по тегам