我正在使用ASP.NET / C#中的ASMX服务。我的服务返回了我的WebMethods的部分的正确数据,但不是全部。有趣的是,所有的WebMethod都非常相似。
以下是始终返回数据的内容:
[WebMethod]
public AccountItem[] GetAllAccounts()
{
AccountItem[] AccountItems = HttpContext.Current.Cache[AccountItemsCacheKey] as AccountItem[];
if (AccountItems == null)
{
List<AccountItem> items = new List<AccountItem>();
using (SqlManager sql = new SqlManager(SqlManager.GetSqlDbiConnectionString()))
{
using (SqlDataReader reader = sql.ExecuteReader("SELECT A.Account_Id, A.Customer_Id, C.Last_Name + ', ' + C.First_Name AS CustomerName, A.[Status], AT.Name AS AcctType, A.Employee_Id, A.Initial_Balance, A.Interest_Rate, '$'+CONVERT(varchar(50), A.Balance, 1) AS Balance FROM Account A JOIN Account_Type AT ON A.Account_Type_Id=AT.Account_Type_Id JOIN Customer C ON A.Customer_Id=C.Customer_Id WHERE [Status]=1"))
{
while (reader.Read())
{
AccountItem item = new AccountItem();
item.AccountId = (int)reader["Account_Id"];
item.CustomerId = (int)reader["Customer_Id"];
item.CustomerName = (string)reader["CustomerName"];
item.AccountStatus = (bool)reader["Status"];
item.AccountType = (string)reader["AcctType"];
item.InitialBalance = (decimal)reader["Initial_Balance"];
item.InterestRate = (decimal)reader["Interest_Rate"];
item.Balance = (string)reader["Balance"];
items.Add(item);
}
reader.Close();
}
}
HttpContext.Current.Cache.Add(AccountItemsCacheKey, items.ToArray(), null, DateTime.Now.AddMinutes(CacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
return items.ToArray();
}
else
{
return AccountItems;
}
}
这是一个永远不会返回数据的人:
[WebMethod]
public TransactionItem[] GetAllTransactions()
{
TransactionItem[] tranItems = HttpContext.Current.Cache[TransactionItemsCacheKey] as TransactionItem[];
if (tranItems == null)
{
List<TransactionItem> items = new List<TransactionItem>();
using (SqlManager sql = new SqlManager(SqlManager.GetSqlDbiConnectionString()))
{
using (SqlDataReader reader = sql.ExecuteReader("SELECT [Transaction_Id],[Account_Id],[Amount],[DateTime],[Comment],TT.[Name] AS [TransType],[Flagged],[Employee_Id],[Status] FROM [Transaction] T JOIN [Trans_Type] TT ON T.Trans_Type_Id=TT.Trans_Type_Id"))
{
while (reader.Read())
{
TransactionItem item = new TransactionItem();
item.TransactionId = (int)reader["Transaction_Id"];
item.AccountId = (int)reader["Account_Id"];
item.Amount = (decimal)reader["Amount"];
item.Timestamp = (DateTime)reader["DateTime"];
item.Comment = (string)reader["Comment"];
item.TransType = (string)reader["TransType"];
item.Flagged = (bool)reader["Flagged"];
item.EmployeeId = (int)reader["Employee_Id"];
item.Status = (bool)reader["Status"];
items.Add(item);
}
reader.Close();
}
}
HttpContext.Current.Cache.Add(TransactionItemsCacheKey, items.ToArray(), null, DateTime.Now.AddMinutes(CacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
return items.ToArray();
}
else
{
return tranItems;
}
}
如你所见,它们几乎相同。两者的SQL查询都返回大量记录,但只有GetAllAccounts()
WebMethod实际返回该数据。
这就是我显示从GetAllAccounts()
传回的数据的方式,效果很好:
@{
Layout = "~/Shared/_Layout.cshtml";
Page.Title = "Accounts";
Page.Header = "BankSite Mobile - Accounts";
var svc = IntranetService.GetAllAccounts();
}
<div data-role="content">
<ul data-role="listview" data-inset="true" data-theme="c">
@foreach(var item in svc){
<li>
<h3><a href="Product.cshtml?acctid=@item.AccountId">Account #@item.AccountId.ToString() (@item.AccountType)</a></h3>
<p>Customer: @item.CustomerName</p>
<p>Account Balance: @item.Balance</p>
</li>
}
</ul>
</div>
然而,这并不正常,尽管它几乎完全相同的代码:
@{
Layout = "~/Shared/_Layout.cshtml";
Page.Title = "Customers";
Page.Header = "BankSite Mobile - Customers";
var svc = IntranetService.GetAllCustomers();
}
<div data-role="content">
<ul data-role="listview" data-inset="true" data-theme="c">
@foreach(var item in svc){
<li>
<h3><a href="Product.cshtml?acctid=@item.CustomerId">Account #@item.CustomerId.ToString() (@item.CustomerId)</a></h3>
<p>Customer: @item.CustomerId</p>
<p>Account Balance: @item.CustomerId</p>
</li>
}
</ul>
</div>
...所以基本上我很困惑。我不明白为什么数据没有按预期从非工作的WebMethod(GetAllCustomers()
)返回。我错过了什么?
答案 0 :(得分:1)
如果禁用从缓存中加载内容,两种方法是否总能成功返回预期的结果集?我会首先尝试一下,我的直觉是缓存的一些时髦(即在你的方法返回之前过期)。然后从那里开始。
答案 1 :(得分:0)
尝试通过直接在Web浏览器中访问Web服务来将问题隔离到Web服务。此外,如果可能,请使用SQL Server Profiler确保Web方法正在查询数据库。
如果它没有查询数据库,那么我猜它已经缓存了一个空数组。
因此,初始“if(tranItems == null)”检查返回false,但它会返回一个空数组作为结果。
答案 2 :(得分:0)
我发现问题是读者检索到的某些字段为空,并且您无法创建空字符串。解决方案基本上是为每个项目属性使用这样的东西:
item.Amount = (reader["Amount"] != DBNull.value) ? (decimal)reader["Amount"] : 0;