Asp.net 创建单页应用程序的最佳堆栈/解决方案,允许多个用户实时贡献和查看更改

Asp.net 创建单页应用程序的最佳堆栈/解决方案,允许多个用户实时贡献和查看更改,asp.net,database,windows,entity-framework,Asp.net,Database,Windows,Entity Framework,你好 我正在尝试为数据库构建一个非常小的显示应用程序。应用程序需要动态显示连接数据库中的数据,而无需用户不断刷新,但用户需要同步速率小于5秒。我研究了web API和MVC结构(CRUD)。这对于单用户输入非常有效,但我需要根据任何用户对数据库所做的任何更改来更改显示。应用程序将只有少量用户(WebSocket) 最好的解决方案是使用。WebSockets由一种高级技术组成,它在客户端和服务器之间创建一个双工连接,每当服务器需要发送数据时,它都可以将数据发送到活动连接。由于您使用的是ASP.NE

你好

我正在尝试为数据库构建一个非常小的显示应用程序。应用程序需要动态显示连接数据库中的数据,而无需用户不断刷新,但用户需要同步速率小于5秒。我研究了web API和MVC结构(CRUD)。这对于单用户输入非常有效,但我需要根据任何用户对数据库所做的任何更改来更改显示。应用程序将只有少量用户(WebSocket) 最好的解决方案是使用。WebSockets由一种高级技术组成,它在客户端和服务器之间创建一个双工连接,每当服务器需要发送数据时,它都可以将数据发送到活动连接。由于您使用的是ASP.NET,这将对您非常有帮助。您可以观看s about Signal

推送通知 您还可以使用对侦听器的推送通知进行推送。在这方面会有所帮助。这不如WebSockets好,因为如果要向服务器发送请求,客户端必须处理HTTP请求

投票 您可以在服务器上创建自己的API函数,并使用轮询向其发送请求。通用轮询器的示例如下:

function Initializable(params) {
    this.initialize = function(key, def, private) {
        if (def !== undefined) {
            (!!private ? params : this)[key] = (params[key] !== undefined) ? params[key] : def;
        }
    };
}
function Poller(params) {
    Initializable.call(this, params);

    var that = this;
    this.initialize("url", window.location.href);
    this.initialize("interval", 5000);
    this.initialize("type", "POST");
    this.initialize("method", "POST");
    this.initialize("data", {});
    this.initialize("strict", true);
    this.initialize("isWebSocket", false);
    this.initialize("message", "Poll");
    this.initialize("webSocketHandler", undefined);
    if (this.isWebSocket && !this.webSocketHandler) {
        this.initialize("module", module);
        this.initialize("page", page);
        this.webSocketHandler = new WebSocketHandler({
            ConnectNow: true,
            module: this.module,
            page: this.page,
            message: this.message,
            Message: function(e) {
                that.done(e.data);
            }
        });
    }

    var defaultFunction = function() {};

    this.initialize("done", defaultFunction);
    this.initialize("fail", defaultFunction);
    this.initialize("always", defaultFunction);

    //WS
    this.initialize("isWebSocketPrepared", function() {
        return true;
    });
    this.initialize("sendingWebSocket", function() {});
    this.initialize("handleUnpreparedWebSocket", function() {});
    this.initialize("sendWSData", function(message) {
        if (that.webSocketHandler.isReady()) {
            if (that.isWebSocketPrepared()) {
                that.webSocketHandler.send(JSON.stringify({
                    module: module,
                    page: page,
                    message: message
                }));
                that.sendingWebSocket();
            } else {
                that.handleUnpreparedWebSocket();
            }
        } else {
            that.handleUnpreparedWebSocket();
        }
    });

    this.isRunning = function() {
        return !!params.intervalID;
    };

    this.run = function() {
        if (this.strict && (this.green === false)) {
            return;
        }
        this.green = false;
        if (!that.isWebSocket) {
            $.ajax({
                url: this.url,
                method: this.method,
                data: this.data
            }).done(function(data, textStatus, jqXHR) {
                that.green = true;
                that.done(data, textStatus, jqXHR);
            }).fail(function(jqXHR, textStatus, errorThrown) {
                that.green = true;
                that.fail(jqXHR, textStatus, errorThrown);
            }).always(function(param1, param2, param3) {
                that.green = true;
                that.always(param1, param2, param3);
            });
        } else {
            that.sendWSData(that.message);
        }
    };

    this.start = function() {
        if (!params.intervalID) {
            this.run();
            params.intervalID = setInterval(this.run.bind(this), this.interval);
        }
    };

    this.stop = function() {
        if (!!params.intervalID) {
            clearInterval(params.intervalID);
            params.intervalID = undefined;
        }
    };

}
永久框架
你也可以使用永远的框架,它是永远加载的
iframe
s。阅读更多信息:

这个问题似乎是基于观点的:你可能想看到:@Progressive当问题邀请意见时,答案并不是固执己见的,因为我们有一组有限的可能性,它们都应该被考虑。是的,我一直都是顺着信号路往前走。我会继续观察和发展。感谢输入。@皮特卡曼,如果我的回答回答了你的问题,那么你可以考虑接受它作为正确的答案。