gpt4 book ai didi

asp.net-web-api - 如何从 Web API 取回 IObservable

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:47 27 4
gpt4 key购买 nike

我有一个简单的 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();

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

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

最佳答案

您有点雄心勃勃,期待 IObservable<T>自动通过网络传输。恐怕 WebAPI 不会为您做那件事。

您看到的是默认 json 序列化器输出 IObservable<T> 属性的结果- 没有,所以你得到的是空括号。

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

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

最重要的是,我认为 WebApi(至少在撰写本文时)是错误的技术选择。你最好看看 SignalR它专为此类场景而构建,包含在当前版本的 ASP.NET 中。它同时支持 javascript 和 .NET 客户端,您可以桥接到 IObservable<T>相当容易。已经有人看过了,比如in this post sporting example code .

一些消息传递中间件,例如 my-Channels Nirvana (编辑:自从被 Terracotta 收购并包装到通用消息传递后,他们的文档中提供了一些 example code。)和 CEP 解决方案,如 SQL Server StreamInsight有开箱IObservable也支持。

关于asp.net-web-api - 如何从 Web API 取回 IObservable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559639/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com