Asp.net mvc 4 使用Breezejs和MVC Web API存储和同步本地数据

Asp.net mvc 4 使用Breezejs和MVC Web API存储和同步本地数据,asp.net-mvc-4,local-storage,breeze,asp.net-web-api,Asp.net Mvc 4,Local Storage,Breeze,Asp.net Web Api,我想使用breezejs api在本地存储(indexdb或websql)中存储数据,还想将本地数据与sql server同步 但我没能做到这一点,也找不到使用breezejs、knockout和MVCAPI的此类应用程序的示例应用程序 我的要求是: 1) 如果internet可用,数据将使用mvc web api来自sql server 2) 如果internet关闭,应用程序将从缓存的本地存储(indexdb或websql)检索数据 3) 一旦打开internet,本地数据将同步到sql s

我想使用breezejs api在本地存储(indexdb或websql)中存储数据,还想将本地数据与sql server同步

但我没能做到这一点,也找不到使用breezejs、knockout和MVCAPI的此类应用程序的示例应用程序

我的要求是:

1) 如果internet可用,数据将使用mvc web api来自sql server

2) 如果internet关闭,应用程序将从缓存的本地存储(indexdb或websql)检索数据

3) 一旦打开internet,本地数据将同步到sql server

请让我知道我是否可以通过使用breezejs api来达到这个要求

如果是,请给我提供一些链接和样品

如果没有,我们可以使用什么其他方法来实现此类要求

谢谢


请帮助我满足此要求。

您可以这样做,但我建议只使用本地存储。基本上,每次从服务器读取或保存到服务器时,都会导出实体并将其保存到本地存储。然后,当需要读入数据时,如果无法访问服务器,则从localstorage读取数据,并使用importentities将其读入管理器,然后在本地查询

function getData() {
    var query = breeze.EntityQuery
               .from("{YourAPI}");

    manager.executeQuery.then(saveLocallyAndReturnPromise)
        .fail(tryLocalRestoreAndReturnPromise)

    // If query was successful remotely, then save the data in case connection 
    // is lost
    function saveLocallyAndReturnPromise(data) {
        // Should add error handling here.  This code
        // assumes tis local processing will be successful.
        var cacheData = manager.exportEntities()
        window.localStorage.setItem('savedCache',cacheData);

        // return queried data as a promise so that this detour is
        // transparent to viewmodel
        return Q(data);
    }
    function tryLocalRestoreAndReturnPromise(error) {
        // Assume any error just means the server is inaccessible.
        // Simplified for example, but more robust error handling is
        // warranted
        var cacheData = window.localStorage.getItem('savedCache');
        // NOTE: should handle empty saved cache here by throwing error;
        manager.importEntities(cacheData); // restore saved cache
        var query = query.using(breeze.FetchStrategy.FromLocalCache);
        return manager.executeQuery(query); // this is a promise
    }
}
这是一个简单的代码框架。您应该检查捕获和处理错误,添加一个断开连接的函数来确定连接,等等

如果您在本地进行编辑,那么还有一些问题需要解决。每次更改缓存时,都需要导出整个缓存或更改(可能取决于缓存的大小)。当存在连接时,您需要首先测试本地更改,如果找到,则在重新查询服务器之前将其保存到服务器。此外,脱机时进行的任何模式更改都会使问题变得非常复杂,因此请注意这一点


希望这有帮助。健壮的实现有点复杂,但这应该给您一个起点。

这一行是强制性的。window.localStorage.setItem('savedCache',data);Breezejs在哪里保存缓存数据?我们是否明确需要保存在本地存储中?否。Breeze单独保存其缓存。该行确保当您再次启动应用程序时,如果没有与服务器的连接,您可以使用来自服务器的最新数据。如果不关闭选项卡或浏览器,则不需要保存到本地存储,只需从缓存工作即可。我的经验是,无论是否连接到服务器,最终用户在启动网页时总是希望数据在那里。