已部署的ASP.Net Web API返回值未更新

时间:2015-01-15 04:37:22

标签: c# asp.net asp.net-web-api deployment

我创建了一个Web API,它将从数据库中获取数据并以json格式返回。例如,我在我的数据库中有2条记录并调用web api它返回2条记录但是当我向数据库添加新数据时它没有显示结果。但是当我在本地运行它时显示3条记录。为了让我能够在我部署的api中看到3条记录,我需要重新进行重新安装和部署。有没有人有这样的经历?你是怎么解决这个问题的?

public class ContactRepository : IContactRepository
{
    private List<Contact> Contacts = new List<Contact>();
    private string ContactId;
    string connectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;

    public ContactRepository()
    {
        using (OleDbConnection conn = new OleDbConnection(connectionstring))
        {
            conn.Open();
            using (OleDbCommand cmd = new OleDbCommand("Select ContactId, Firstname, Lastname, Email, Mobile FROM sysdba.CONTACT WHERE LASTNAME LIKE 'R%' AND FIRSTNAME LIKE 'R%' AND EMAIL <> '' ORDER BY CreateDate DESC, LASTNAME, FIRSTNAME", conn))
            {
                OleDbDataReader dr;
                dr = cmd.ExecuteReader();
                while (dr.Read() == true)
                {
                    ContactId = dr[0].ToString();
                    Add(new Contact { Name = dr[1].ToString() + " " + dr[2].ToString(), Email = dr[3].ToString(), MobileNo = dr[4].ToString() });
                }
            }
        }
    }

    public IEnumerable<Contact> GetAll()
    {
        return Contacts;
    }
}

interface IContactRepository
{
    IEnumerable<Contact> GetAll();
    Contact Get(string id);
    Contact Add(Contact contact);
    void Remove(string id);
    bool Update(Contact contact);
}

public class ContactController : ApiController
{
    static readonly IContactRepository repository = new ContactRepository();

    public IEnumerable<Contact> GetAllContact()
    {
        return repository.GetAll();
    }
}

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您在Controller中创建了ContactRepository的静态实例。所以它只会创建一次。所以最终ContactRepository构造函数只会被调用一次。

我可以看到getAll()返回正在构造函数中填充的联系人列表。

  
    

为了让我能够在我部署的api中看到3条记录,我需要重新进行重新安装和部署。

  

问题在于静态实例,因此无需重新部署。重新启动IIS也可以获得预期的结果。

因此,在构造函数中使ContactRepository非静态可以解决您的问题。

但这会导致每次创建新实例时都会执行sql查询,所以更好的方法是将逻辑从构造函数移动到GetAll()中的ContactRepository方法。

答案 1 :(得分:0)

问题是您的ContactController有一个ContactRepository的静态成员,并且您在数据库中查询联系人的唯一时间是ContactRepository的构造函数。

这个静态初始化只在第一次请求时发生一次,后续请求将始终返回相同的联系人列表。

您应该将您的成员更改为非静态成员,以便为每个控制器实例创建新的存储库实例,或者每次更改存储库GetAll方法以执行查询。