0

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 观察到)但希望在七年后更成熟?

4

1 回答 1

2

没有直接的方法。但是您可以发布自己的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;
    }
}

在上面的示例中,我们将 a 压RequestExampleObservable. 您可以订阅它并使用它Request.Result.SetResult(...)来返回请求。

ExampleObservable.Subscribe(req => req.Result.SetResult(Ok(Service.GetExample(id)));
于 2017-11-06T10:22:30.387 回答