0

我正在设计一个用 C# 和 AspNetCore 编写的应用程序,它需要向微服务发出多个 HTTP 请求并在返回控制器之前聚合结果。

我研究过 MediatR 管道,但似乎有限且不适合这种特定情况。

我想在 map 和 reduce 领域中会有一些有用的东西,但很难找到我的开发人员可以快速使用的框架。

我们希望确保在一个或多个请求失败时终止聚合。

我使用工作线程创建了一个概念证明,例如

var results = await Task.WhenAll(task1, task2);

但这并没有提供像 MediatR 开发人员可以轻松采用和单元测试的框架。

如果我的概念证明是使用 Rx 扩展和 Observable.zip 编写的,我想也可以这么说。尽管如此,我还是很好奇,并希望找到在 C# 中使用 Observable.zip 的示例,类似于此 Netflix 博客文章中所展示的示例

使用 RxJava 在 Netflix API 中进行反应式编程

4

1 回答 1

0

我已经构建了一个示例来帮助我了解在 .NET 中使用 Rx 的功能。

这是代码。

class Program
{
    static void Main(string[] args)
    {
        new Program().Run().Wait();
    }

    public async Task Run()
    {


        var resources =
            new List<string>
                {
                    "http://www.google.com"
                    ,"http://www.yahoo.com"
                    ,"http://cnn.com"
                    ,"http://microsoft.com"
                }
                .ToObservable()
                .Select(s => Observable.FromAsync(() => DownloadAsync(s)))
                .Concat()
                .Where(w => w.IsSuccessStatusCode)
                .Select(s => Observable.FromAsync(() => GetResources(s)))
                .Concat()
                .Where(w => w.Any())
                .SelectMany(s => s)
                .ToEnumerable()
                .OrderBy(o => o.Name);

        foreach (var re in resources)
        {
            Console.WriteLine(re.Name);
        }

        Console.ReadLine();
    }

    public async Task<HttpResponseMessage> DownloadAsync(string url)
    {
        var request = new HttpRequestMessage(HttpMethod.Get, url);

        var client = new HttpClient();

        return await client.SendAsync(request);
    }

    public async Task<IEnumerable<Resource>> GetResources(HttpResponseMessage message)
    {
        var ignoreContent = await message.Content.ReadAsStringAsync();
        return new List<Resource> { new Resource { Name = message.Headers.Date.ToString() } };
    }
}
public class Resource
{
    public string Name { get; set; }
}
于 2018-03-20T15:36:17.287 回答