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

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

在上面的例子中,我们在ExampleObservable中推送一个Request。您可以订阅并使用Request.Result.SetResult(...)返回请求。

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

相关内容

  • 没有找到相关文章

最新更新