如何从 Web API 获取 IObservable



我有一个简单的Web API,它返回一个Iobservable。我正在使用HttpClient来获取Observable,以便我可以订阅它。我的问题是订阅时返回的 Iobservable 发送了一个"空"结果。

服务器

public IObservable<DataItem> GetDataItems()
{
    return Observable.Generate(0, i => i < 10, i => i + 1, 
        i => new DataItem 
        {
            Id = i, 
            Name = String.Format("Storage{0}",i)
        });
}

客户

public IObservable<DataItem> GetDataItems()
{
    using (HttpClient apiClient = new HttpClient())
    {
        apiClient.BaseAddress = new Uri("http://localhost:9001");
        apiClient.DefaultRequestHeaders.Add("x-user-authentication", "xxxxxx");
        return apiClient
            .GetAsync("api/xxxx/yyyy").Result.Content
            .ReadAsAsync<DataItem>().ToObservable();
    }
}
var source = GetDataItems();
List<DataItem> items = new List<DataItem>();
IDisposable consoleSubscription = source.Subscribe(
            x => Console.WriteLine("{0}:{1}", x.Id, x.Name),
            ex => Console.WriteLine("OnError : {0} ", ex.Message),
            () =>  Console.WriteLine("Encountered End of Stream")
            );
        consoleSubscription.Dispose();

我的问题是我没有从服务器获取任何数据。我得到一个"空"可观察量。我针对我的控制器编写了一个单元测试,它确实返回了数据项。

任何建议请帮助。无法理解我哪里出错了。服务器或客户端上没有错误。

你有点雄心勃勃,希望IObservable<T>自动通过网络流式传输。恐怕WebAPI不会为你做到这一点。

您所看到的是默认 json 序列化程序输出IObservable<T>属性的结果 - 没有,因此您会得到空大括号。

单元测试之所以有效,是因为它都在内存中 - 没有发生序列化/反序列化。

有一些方法可以使用 HttpResponseMessage 的 StreamContent 属性来流式传输结果,您可以桥接到/从IObservable<T>桥接 - 但它并不是真正的惯用 WebApi。WebAPI 的异步支持实际上旨在异步处理服务器上具有单项响应的请求,而不是返回连续流式处理事件。

底线是我认为WebApi(至少在撰写本文时(是错误的技术选择。最好查看专为此类方案构建的 SignalR,并包含在当前版本的 ASP.NET 中。它同时支持javascript和.NET客户端,您可以相当轻松地桥接到IObservable<T>。有些人已经看过这个了,比如在这篇文章中运动示例代码。

一些消息传递中间件,如my-Channels Nirvana(编辑:自从被Terracotta收购并包装到通用消息传递中,一些示例代码可以在他们的文档中找到(,以及像SQL Server StreamInsight这样的CEP解决方案也有开箱即用IObservable支持。

相关内容

  • 没有找到相关文章

最新更新