【问题标题】:Browser successfully received the given MVC Web API response - How to ensure in server side?浏览器成功接收到给定的 MVC Web API 响应 - 如何在服务器端确保?
【发布时间】:2016-06-30 10:37:56
【问题描述】:

我正在为 GET 方法编写一个 Web API。此方法将返回 JSON 对象作为响应。我需要一个动作过滤器方法或一个在浏览器成功接收到响应时自动调用的事件。

【问题讨论】:

  • 您需要在服务器端还是客户端(即浏览器)上进行此事件?如果在服务器上,定义“成功接收”。
  • 我在服务器端需要它。不在客户端。
  • 然后定义“成功接收”。服务器如何确定这意味着什么?正如@bwyn 建议的那样,一种选择是让客户端决定成功意味着什么,并让他们通过额外的调用通知服务器。
  • Kirsh,我会说清楚的。当客户端成功收到响应时,我需要将响应数据存储在数据库表中。如果这可以由客户端确定,则客户端必须调用另一种 API 方法,说明客户端已成功接收到响应。在这一点上,我需要在服务器端再次重新生成响应数据,我需要将它保存在会话或其他地方。当客户端成功收到响应时,我可以在服务器端获取事件或操作过滤器,而不是做所有这些事情吗?
  • 你似乎没有抓住重点。服务器很容易知道它已经向客户端发送了一条消息。服务器不可能知道的是客户端是否“成功接收”,无论这意味着什么,除非客户端告诉服务器。再说一遍:请定义“成功接收”。

标签: api events model-view-controller response action-filter


【解决方案1】:

以下内容改编自 Nicholas Zakas 的 Professional JavaScript for Web Developers(第 3 版):

Ajax 函数:

function Ajax() {
    var xhr, responseObj, getCompletionFunction;
    var completionFunction;

    this.setGetCompletionFunction = function (value) { getCompletionFunction = value; }

    this.getRequest = function (url) {
        completionFunction = getCompletionFunction;
        xhr = new XMLHttpRequest();
        xhr.onreadystatechange = readyStateChangeFunction;
        xhr.open("get", url, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send(null);
    }

    function readyStateChangeFunction() {
        if (xhr.readyState == 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
                responseObj = JSON.parse(xhr.responseText);
                completionFunction(responseObj);
            } else {
                var errorMessage = xhr.status;
                responseObj = { errorMessages: ["An error of type " + errorMessage + " occurred while attempting to reach the server."] };
                completionFunction(responseObj);
            }
        }
    }
}

感兴趣的线是:

if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {

这决定了 Web Api 调用是否成功。如果是这样,该函数解析响应并将其输入到回调。否则,将向回调返回错误消息。

Ajax 函数使用示例:

var ajax = new Ajax();

var completionFunction = function (data) {
    var returnedData = data;
}

ajax.setGetCompletionFunction(completionFunction);

ajax.getRequest("/api/Home/1");

【讨论】:

  • 感谢您的回答。但是有没有可能在服务器端获得它?
  • 我认为最好的办法是从回调向服务器发送一个额外的 ajax 调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多