3

假设您有一个 ASP.NET MVC 4 Web API 项目。您的资源之一,当您通过 URL 调用它时,会在获取性能监控数据的同时等待指定的时间量,然后在完成后以 JSON 形式将其全部返回。但是,在输入 URL 和过程完成之间,是否有一种方法可以动态返回数据,即。每秒检索性能数据并将其显示在浏览器中。

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

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

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

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

4

3 回答 3

1

我认为您要的是一种基于 HTTP 的流式传输机制。当然,这样做需要发送一个内容长度未知的响应。

这个问题涉及那种可能是解决方案的一部分的分块传输编码。不知道客户端是什么,我不能说它将如何处理您想要推送的 JSON。

好问题。

于 2012-09-02T22:21:53.723 回答
1

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

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

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

于 2012-09-02T22:22:57.110 回答
1

无论 MVC 控制器和路由管道如何,您都可以组合一个老式的 ASP.Net IHttpHandler 实现。http://support.microsoft.com/kb/308001。然后,您将可以完全访问响应流,并且可以根据需要缓冲或不缓冲。您必须考虑是否要长时间占用工作线程,并且如果您计划或多或少地连续流式传输,那么您肯定希望在等待存储库的进一步响应时使用 IAsyncHttpHandler。

话虽如此,Web API 也支持异步,但它更复杂一些。如果您计划按时发回数据,那么我强烈建议您再看看 SignalR,如果您计划最终拥有一些 JavaScript 客户端,它可以立即完成所有这些工作。这要容易得多。

如果你真的想在 Web API 中编写异步的东西,这里有一些资源可以帮助你;

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 中找到它,您需要从http://的 Web API 堆栈夜间构建中获取它aspnetwebstack.codeplex.com/SourceControl/list/changesets

YMMV - 祝你好运!

于 2012-09-03T11:16:05.783 回答