2011-02-02 10 views
1

私はASP.NET/C#でASMXサービスを使用しています。私のサービスはの適切なデータを返します。私のWebMethodsのうち一部のものはですが、すべてではありません。興味深いのはWebMethodsのすべてが非常に似ている部分です。ASMXサービスが常にデータを返すとは限りません

[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クエリーは1トンのレコードを返しますが、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="[email protected]">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="[email protected]">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

あなたがブレークポイントにGetAllTransactions()を介してすべての方法を設定した場合、TransactionItem []が満たされている:ソリューションは、すべてのアイテムのプロパティに対して、このようなものを使用することが本質的でしたか? –

答えて

0

リーダーによって取得されたフィールドの一部がnullで、null文字列を作成できないという問題がありました。

item.Amount = (reader["Amount"] != DBNull.value) ? (decimal)reader["Amount"] : 0; 
1

キャッシュからの読み込みを無効にすると、両方のメソッドが正常に実行され、期待される結果セットが返されますか?最初に試してみると、私の直感は、キャッシュを使ってファンキーなものがあるということです(つまり、メソッドが戻る前に期限が切れます)。それからそこから行ってください。

+0

は負です。私はキャッシングを無効にし、それでも同じ空のセットを返します。キャッシングは60分に設定されています。 public static int CacheDuration { get {return 60; } } –

0

Webブラウザで直接Webサービスにアクセスすることで、Webサービスに問題を特定してみてください。また、可能であれば、SQL Server Profilerを使用して、Webメソッドがデータベースを照会していることを確認してください。

データベースを照会していない場合、空の配列がキャッシュされていると思います。

したがって、if(tranItems == null)チェックはfalseを返しますが、空の配列を結果として返します。

関連する問題