3

プロジェクトには、キャッシュ情報を含むクラスがあります。

public class SOLECache
{
    public DateTime CreatedDTM { get; set; }
    public int UserID { get; set; }
    public int MaxAgeSeconds { get; set; }
    public object Data { get; set; }
}

ここで、プロパティ Data は、キャッシュしたいオブジェクトを保持します。これは、任意の型である可能性があります。複数の Web サーバーを備えた運用環境があるため、キャッシュを処理するために Redis と ServiceStack を使用しようとしています。現在、キャッシュは Redis サーバーに適切に保存されており、その部分は正常に機能しています。問題は、キャッシュを取得しようとするときです。

 _cacheClient.Get<AppUser>("someCacheKey");

Data プロパティの値は常に NULL です。したがって、基本的に、データが適切なキーの下で Redis サーバーに保存されていることは明らかですが、データを取得すると、常に NULL である Data プロパティ以外のすべてが取得されます。

なぜこれが当てはまるのか、誰かが私に洞察を与えることができますか? data プロパティに保存しているオブジェクトに、いくつかの読み取り専用プロパティといくつかのメソッドがあるためでしょうか? これはクリーンな POCO ではありませんか? 格納されているオブジェクトのサンプル構造を次に示します。

public class AppUser
{ 
   public int UserId {get; set;}
   public string FirstName {get; set;}
   public string LastName {get; set;}
   public string FullName
   {
      get {
         return FirstName + " " + LastName;
      }
   }
   public void DoSomething()
   {
      // some method logic here...
   }
}

このクラスが原因で ServiceStack.RedisClient が AppUser インスタンスを適切にシリアル化できない可能性はありますか?

Redis でキャッシュを設定する方法は次のとおりです。

_cacheClient.Set("someCacheKey", soleCache, DateTime.UtcNow.AddSeconds(soleCache.MaxAgeSeconds))

ここで、soleCache は、Data プロパティが設定された SOLECache のインスタンスです。Redis に保存されるデータは次のとおりです。

{"CreatedDTM":"2013-06-28T13:45:56.5091664-04:00","UserID":123,"MaxAgeSeconds":60,"Data":{"FullName":"John M Doe","FirstName":"John","MiddleName":"M","LastName":"Doe","Email":"me@here.com","BackupEmail":"me@there.com","GradYear":null,"PostalCode":"12345     ","Location":"12345     ","City":null,"IsValid":true,"Active":true,"AccessLevel":10,"CurrentApp":0,"CurrentURL":"http://localhost:4387/","RequestMethod":"GET","IsMobile":false,"IsInApp":false,"ServerName":"ITSWEB-JMDOE","ID":40117,"IsAdmin":true,"Theme":"basic","ExpirationDT":null,"WebFolderName":"jmdoe","ProgramCD":null,"BranchCD":"MBIM","RoleOverride":0,>"CurrentAppRoleID":0,"EnableNativeMailFLG":false,"PasswordStatus":"GOOD","CampusCD":"M","Campus":"Smallville","DisclaimerDate":"2012-07-02T10:55:54.297","SecurityQuestion":null,"ClassificationMSK":4,"IsLinkedToCurrentApp":false,"IsBlockedFromCurrentApp":false,"IsBlockedMessageText":null,"CurrentAppRoleName":null,"AssignedAppRoleID":0,"AppSmallGroup":0,"PermissionsArray":[],"AdminPermissionsArray":[],"ViewLevel":[],"LastLoginDTM":"2013-06-27T16:28:23.21","Session":{"SessionID":"1923dac2-f3af-4dc5-ad51-7202fc077ba3","SessionCreatedDTM":"2013-06-28T09:03:13.12","SessionTimeout":60,"SessionUserID":40117,"SessionCurrentApp":0,"SessionLastViewDTM":"2013-06-28T13:24:37.69","SessionUserAgent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36","SessionIP":"127.0.0.1","SessionLastURL":"http://localhost:4387/Home/CacheInfo","SessionServer":"ITSWEB-JMDOE","LastLoginDTM":null,"SessionLoginMethod":null,"ADUserName":null,"ADPassword":null,"Errors":{},"HasErrors":false,"ModelState":{}},"CurrentInstanceID":0,"CurrentPageHasNotes":false,"CurrentPageIsFavorited":false,"BrowserBrand":"Chrome","BrowserVersion":"28.0","BrowserPlatform":"Windows 8","BrowserValid":true,"Favorites":[],"FullNameWithEmail":"John M Doe (jmdoe@here.com)","FullNameWithoutMiddleName":"John Doe","IsStudent":true,"Errors":{},"HasErrors":false,"ModelState":{}}}

何らかの理由でこのオブジェクトを適切にシリアル化しない ServiceStack.Text.JsonSerializer メソッドに問題があることを突き止めました。このメソッドを NewtonSoft の Json Serializer に置き換えると、正常に動作します... ServiceStack の問題のようですが、間違っている可能性があります...

4

1 に答える 1

1

Data プロパティの値は常に NULL です。
したがって、タイプのオブジェクトをキャッシュに挿入しているように見えますSOLECache(質問から:ここで、soleCacheはデータプロパティが設定されたSOLECacheのインスタンスです。
そして、キャッシュからタイプにデータを引き出したいAppUser(質問から_cacheClient.Get<AppUser>("someCacheKey");:)たぶんこれは単なるタイプミスです ( に Data プロパティが表示されませんAppUser) が、型の切り替えが問題になる可能性があります。

SOLECacheキャッシュタイプに挿入してタイプSOLECacheアウトできるはずです。あなたが持っている限りJsConfig.ExcludeTypeInfo = false;(これがデフォルトです)、 Data プロパティに正しいタイプを入力する必要があります。JsConfig.ExcludeTypeInfo = true;Redis に格納されたデータにフィールドが表示されないため、お持ちのようです__type(これが、ServiceStack.Text がオブジェクトの型 Data を認識する方法です)。TypeInfo を除外している場合、キャッシュ データを逆シリアル化すると、Data プロパティに JSON 文字列が入力されます。

于 2013-06-28T21:02:07.840 に答える