具有持久性的下拉列表和Web服务

时间:2014-01-15 21:37:47

标签: c# asp.net-mvc linq-to-sql linq-to-xml persistence

我有一个Web服务,我想用它作为我的下拉列表的来源。此Web服务每周更新一次数据。

现在我不认为每次显示下拉列表时调用Web服务都是一个好主意,因为数据只会每周更新一次。

Web服务输出是XML,所以我考虑将它放在一个文件中并使用linq to xml来读取文件并填充下拉列表。但是如果多个用户是同一个页面并且需要填充相同的下拉列表,我担心线程问题。

我的下一个想法是将xml存储在app_data目录中包含的本地数据库中,对db文件的多次读取应该是线程安全的。

所以我想我的问题是如何读取xml数据以填充下拉列表,当它存储在数据库中时是否为linq to xml,linq to sql?

另外,如何让我的应用程序每周调用一次服务来刷新本地数据库?

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果使用LINQ to XML将其存储在数据库中,那么读取它的明显选项是LINQ TO SQL。但是您可以存储XML文件本身并将其用作下拉列表的数据源。您只需要编写实用程序,它将使用webservice的新输出更新您的XML文件。

答案 1 :(得分:0)

我想你有以下方法:

DateTime ComputeLastPublicationDate();

List<Item> GetListFromWebService();

void StoreListToLocalStorage(List<Item> list, DateTime queryDateTime);

List<Item> GetListFromLocalStorage(out DateTime queryDateTime)

如果列表从未存储在localy中,则最后一个返回null。

private object itemsLock = new object();
private DateTime? lastQuery = new DateTime();
private List<Item> items;

public List<Item> Items
{
    get
    {
        DateTime lastPublication = ComputeLastPublicationDate();

        if (items != null && lastQuery >= lastPublication)
            return items;

        lock (itemsLock)
        {
            // lock double check
            if (items != null && lastQuery >= lastPublication)
                return items;

            // not yet retrieved locally 
            if (items == null)  
            {
                items = GetListFromLocalStorage(out lastQuery);
            }
            if (item == null || lastQuery < lastPublication)
            {
                items = GetListFromWebService();
                lastQuery = DateTime.Now;
                StoreListToLocalStorage(items, lastQuery);
            }
            return items;
        }
    }
}

我希望这会有所帮助。