是否可以通过URL调用Web API获取实时数据?

时间:2012-09-02 21:56:51

标签: c# asp.net-mvc json asp.net-web-api

假设您有一个ASP.NET MVC 4 Web API项目。当您通过URL调用它时,其中一个资源会在获得指定时间内的性能监视数据时等待,然后在完成后以JSON格式返回所有资源。但是,在输入URL和进程完成之间,有没有办法动态返回数据,即。每次检索性能数据并在浏览器中显示它时。

这是问题所在: 据我所知,就任何人似乎都知道,通过URL调用API资源是静态的。这意味着,在资源检索到所有信息之前,JSON不会出现,这不是我想要的。我希望能够在API资源检索数据时不断更新浏览器中的JSON。

由于我在存储库类和控制器类中工作,因此Javascript不是一个选项。我尝试过使用SignalR,但显然在这种情况下不起作用,特别是因为我无法使用Javascript。

有没有办法通过对API的URL调用来获取实时数据?

例证: 谷歌地图。 您可以通过网址调用Google Maps API的唯一方法是使用“静态”地图,该地图会显示特定位置的单个图片。没有任何形式的互动。如果您想要一个动态的“实时”地图,您需要构建一个Web应用程序,并在视图页面中使用Javascript在您的应用程序中使用API​​资源。无法通过URL调用它。

3 个答案:

答案 0 :(得分:1)

我认为你所要求的是一种基于HTTP的流媒体机制。当然,这样做需要发送未知内容长度的响应。

This question处理那种可能是解决方案一部分的分块传输编码。不知道客户端是什么,我不知道它将如何处理你想要推进的JSON。

很棒的问题。

答案 1 :(得分:1)

您当然可以根据需要立即开始将响应流式传输回浏览器。它通常是缓冲的,但它不一定是。我过去曾经使用过这个技巧。事实上,SignalR在某些操作模式下做了类似的事情,虽然我应该添加(现在我已经重新阅读了你的问题)尽管HTTP支持这一点,但默认情况下从Web API控制器来看并不明显。我认为你需要在响应处理中稍微降低一点,这样你就可以刷新缓冲区而不是简单地从你的web方法中返回一个POCO,如果这就是你的意思。

基本上,在收集完每条信息之后,你会想要写缓冲区,所以我认为你不能用典型的模型做到这一点。我认为你需要一个自定义消息处理程序http://www.asp.net/web-api/overview/working-with-http/http-message-handlers来获取有效负载才能做到这一点。

我很好奇,你说你想发回JSON但你不允许使用JavaScript吗?

答案 2 :(得分:1)

无论MVC控制器和路由管道如何,您都可以将旧式ASP.Net IHttpHandler实现放在一起。 http://support.microsoft.com/kb/308001。然后,您将完全访问响应流,您可以根据需要缓冲或不缓冲。你必须考虑是否要长时间绑定工作线程,如果你计划连续或多或少地连续流,那么你肯定想要使用IAsyncHttpHandler而等待来自你的回购的进一步响应。

话虽如此,Web API也支持Async,但它更复杂一些。如果你计划在什么时候发回数据,那么我强烈建议你再看看SignalR,如果你计划最终拥有一些JavaScript客户端,它会开箱即用。这要容易得多。

如果您真的想在Web API中编写Async内容,可以使用以下几种资源来帮助您;

http://blogs.msdn.com/b/henrikn/archive/2012/02/24/async-actions-in-asp-net-web-api.aspx

这个看起来就像你需要的那样; http://blogs.msdn.com/b/henrikn/archive/2012/04/23/using-cookies-with-asp-net-web-api.aspx

为了在示例中使用该PushStreamContent()类,您将无法在System.Net.Http.dll中找到它,您需要从Web API堆栈中获取它,每晚构建在{ {3}}

YMMV - 祝你好运!