已部署 ASP.Net Web API Return 值未更新
Deployed ASP.Net Web API Return Value Not Updated
我创建了一个 Web API,它将从数据库中获取数据并 return 以 json 格式。例如,我的数据库中有 2 条记录,调用网络 api 它 return 是 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();
}
}
问题是您的 ContactController
有一个 ContactRepository
的静态成员,并且您唯一一次查询数据库中的联系人是在 ContactRepository
.[=14 的构造函数中=]
此静态初始化只发生一次,在第一次请求时,后续请求将始终return相同的联系人列表。
您应该将您的成员更改为非静态成员以便为每个控制器实例创建一个新的存储库实例,或者更改您的存储库 GetAll
方法以每次执行查询。
发生此行为是因为您正在 Controller 中创建 ContactRepository 的静态实例。所以它只会创建一次。所以最终 ContactRepository
构造函数只会被调用一次。
我可以看到 getAll()
returns 联系人列表正在构造函数中填写。
In order for me to see the 3 records in my deployed api I need to REBUILD and DEPLOY again.
问题出在静态实例上,因此无需重新部署。重新启动 IIS 也会得到预期的结果。
因此在构造函数中将 ContactRepository 设为非静态将解决您的问题。
但这会导致每次创建新实例时都执行 sql 查询,因此更好的方法是将逻辑从构造函数移至 ContactRepository
中的 GetAll()
方法。
我创建了一个 Web API,它将从数据库中获取数据并 return 以 json 格式。例如,我的数据库中有 2 条记录,调用网络 api 它 return 是 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();
}
}
问题是您的 ContactController
有一个 ContactRepository
的静态成员,并且您唯一一次查询数据库中的联系人是在 ContactRepository
.[=14 的构造函数中=]
此静态初始化只发生一次,在第一次请求时,后续请求将始终return相同的联系人列表。
您应该将您的成员更改为非静态成员以便为每个控制器实例创建一个新的存储库实例,或者更改您的存储库 GetAll
方法以每次执行查询。
发生此行为是因为您正在 Controller 中创建 ContactRepository 的静态实例。所以它只会创建一次。所以最终 ContactRepository
构造函数只会被调用一次。
我可以看到 getAll()
returns 联系人列表正在构造函数中填写。
In order for me to see the 3 records in my deployed api I need to REBUILD and DEPLOY again.
问题出在静态实例上,因此无需重新部署。重新启动 IIS 也会得到预期的结果。
因此在构造函数中将 ContactRepository 设为非静态将解决您的问题。
但这会导致每次创建新实例时都执行 sql 查询,因此更好的方法是将逻辑从构造函数移至 ContactRepository
中的 GetAll()
方法。