我有一个带有POST方法的Web API控制器,我想用它来刷新数据并返回它。我的抓取工具抓取HTML进行解析,然后向SourceObservable发出一个值,其中包含已解析的数据。实际上Repository.Save(accreditationData)
保存后,它就可以正常工作。但是返回此accreditationDataObservable
无效,因此我的Action永远不会结束响应,而Postman似乎会无限期地等待:
[HttpPost]
public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
var savedSubject = new Subject<bool>();
AllMantainedCrawler.SourceObservable.Subscribe(accreditationData => {
Repository.Save(accreditationData);
savedSubject.OnNext(true);
});
var accreditationDataObservable = AllMantainedCrawler.SourceObservable.TakeUntil(savedSubject.AsObservable());
AllMantainedCrawler.SourceSubject.OnNext(new Uri("my URL here"));
return await accreditationDataObservable;
}
我还尝试了Take(1)
而不是TakeUntil
,并且还返回了ToTask()
而不是可观察的,但是得到了相同的结果。有什么建议吗?
答案 0 :(得分:2)
AllMantainedCrawler.SourceSubject.OnNext(new Uri(“我的网址在这里”));
此行强制爬虫发射。因此savedSubject
也会发出。
var accreditationDataObservable = AllMantainedCrawler.SourceObservable.TakeUntil(savedSubject.AsObservable());
如果saveSubject发出上述行,请完成accreditationDataObservable
,但在最后一行中,您尝试等待已完成的accreditationDataObservable。
如果您删除了OnNext行并让搜寻器发出,则您可以等待accreditationDataObservable,只要它完成即可。
答案 1 :(得分:0)
永远不要在OnNext
内调用Subscribe
。总有一种避免它的方法。
在您的代码中,如果没有OnNext
,这似乎是等效的:
public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
var accreditationDataObservable = AllMantainedCrawler.SourceObservable.Take(1).Do(x => Repository.Save(x));
AllMantainedCrawler.SourceSubject.OnNext(new Uri("my URL here"));
return await accreditationDataObservable;
}
但是,由于您在问题中没有提供足够的详细信息,因此我无法理解AllMantainedCrawler.SourceSubject.OnNext(new Uri("my URL here"));
在这里的操作。如果您可以提供完整的代码,我想我可以为您提供帮助。
如前所述,我不知道SourceSubject
与SourceObservable
的关系,但是如果我可以假设accreditationData
只是Uri
,那么这将起作用:
public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
return await Observable.Start(() => Repository.Save(new Uri("my URL here")));
}