【问题标题】:Is it possible to get real-time data via a URL call to a Web API?是否可以通过对 Web API 的 URL 调用获取实时数据?
【发布时间】:2012-08-27 17:31:18
【问题描述】:

假设您有一个 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 调用它。

【问题讨论】:

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


    【解决方案1】:

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

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

    好问题。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 当您在浏览器中通过 URL 调用 API 资源时,至少在 ASP.NET MVC Web API 中,您只是通过模型类和控制器工作。首先,根据您的路由,调用模型中的协调方法,然后在 API 控制器中调用该方法,在浏览器中返回 JSON 或 XML(取决于您指定的内容)。结果,与视图没有联系,因此不可能与客户端脚本 (JS) 关联,因为所有这些都是在服务器端完成的。
      • 所以你是直接用浏览器访问 API 资源?为什么不创建一个使用 Ajax 加载 API 资源的 HTML 页面“视图”。然后你可以用任何你喜欢的方式在浏览器中渲染它,必要时使用 JavaScript?
      • 当然可以。这是下一个(也是更容易的)阶段。 :) 顺便看到你的编辑。那么通过发送一个HttpResponseMessage,客户端(本例中的浏览器)就可以接收并显示呢?
      • 你可以直接访问响应流,但我不确定这对你有什么帮助。我认为您需要更深入地了解管道。如果是我,我会放弃这种方法的 Web API,而只构建一个简单的 IHttpHandler。然后,您将可以访问原始消息并能够控制缓冲,而无需浏览您可能不需要的所有 Web API 管道。
      • 这个管道很残酷,但我只需要找出一件事:如何将创建的 HttpResponseMessage 发送到客户端(浏览器)。一旦我能做到这一点,我就是金子。我的存储库方法有一个收益返回,因此每次检索一个值时(每秒)它都会向控制器发送一个值。我怎样才能立即将响应发送到浏览器,而不是在检索到所有数据后从控制器“返回”它?
      【解决方案3】:

      您可以将老式的 ASP.Net IHttpHandler 实现放在一起,而不管 MVC 控制器和路由管道如何。 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 中找到它,您需要从 Web API 堆栈中获取它,每晚构建在 @ 987654324@

      YMMV - 祝你好运!

      【讨论】:

      • 非常感谢。不过,PushStreamContent() 在 System.Net.Http 中。只是它的构造函数与第二个链接中示例中的构造函数不同。那么夜间构建(已经得到它)中有什么命名空间呢?因为显然,它并没有覆盖 System.Net.Http 之一。
      • 没关系,显然该教程有点被误解了。它向 PushStreamContent 构造函数传递了一个不正确的参数。
      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 2015-10-17
      • 1970-01-01
      • 2020-04-26
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多