2017-10-16 11 views
0

J'ai parcouru ce document Microsoft Caching Support for WCF Web HTTP Services et j'ai réussi à créer une mise en cache pour une liste d'utilisateurs.
Voici à quoi il ressemble:WCF REST liste de cache en fonction de l'ID

public List<ForJson.User> UserList() 
{ 
    bool nil; 
    WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(this.idGenerator.GetId(this.usersEtag, out nil)); 
    var userList = this.UnitOfWork.UserRepository.GetAll() 
     .Result.Select(u => new ForJson.User 
     { 
      FirstName = u.FirstName, 
      LastName = u.LastName, 
      UserId = u.UserId, 
      CardNumber = u.CardNumber 
     }) 
     .ToList(); 
    WebOperationContext.Current.OutgoingResponse.SetETag(this.idGenerator.GetId(this.usersEtag, out nil)); 
    return userList; 
} 

Je voulais aussi mettre en œuvre cette liste pour des actifs pour l'utilisateur spécifique, mais pas de chance. Je trouve difficile de comprendre ce que je fais mal. Si quelqu'un pouvait me signaler les erreurs:

public List<ForJson.Asset> AssetList(int? userId) 
{ 
    bool nil; 
    List<ForJson.Asset> assetList; 
    if (userId != null) 
    { 
     if (!this.assetEtag.TryGetValue(userId.Value, out object eTag)) 
     { 
      eTag = new object(); 
      this.assetEtag.Add(userId.Value, eTag); 
     } 
     WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(this.idGenerator.GetId(eTag, out nil)); 
     assetList = this.UnitOfWork.UserRepository.Get(userId.Value) 
      .Result.Assets.Select(a => new ForJson.Asset 
      { 
       AssetId = a.AssetId, 
       Barcode = a.Barcode, 
       Type = a.Type.Name, 
       UserId = userId.Value 
      }) 
      .ToList(); 
     WebOperationContext.Current.OutgoingResponse.SetETag(this.idGenerator.GetId(eTag, out nil)); 
     return assetList; 
    } 
    WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(this.idGenerator.GetId(this.assetEtag, out nil)); 
    assetList = this.UnitOfWork.AssetRepository.Find(a => a.UserId == null) 
     .Result.Select(a => new ForJson.Asset 
     { 
      AssetId = a.AssetId, 
      Barcode = a.Barcode, 
      Type = a.Type.Name 
     }) 
     .ToList(); 
    WebOperationContext.Current.OutgoingResponse.SetETag(this.idGenerator.GetId(this.assetEtag, out nil)); 
    return assetList; 
} 

Comment cela fonctionne-t-il maintenant? Comme il ne prend pas compte userId dans les prochains appels de méthode. Lorsque premier appel est avec userId puis pendant 5 prochaines minutes, il retourne actifs pour cet utilisateur (quel que soit l'utilisateur étant nul ou tout autre identifiant)

<outputCacheSettings> 
    <outputCacheProfiles> 
     <add name="CacheFor5Minutes" duration="300" varyByParam="none" sqlDependency="AssetsSystem:Users;AssetsSystem:Assets"/> 
    </outputCacheProfiles> 
    </outputCacheSettings> 

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "userList")] 
[AspNetCacheProfile("CacheFor5Minutes")] 
List<ForJson.User> UserList(); 

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "assetList?userId={userId}")] 
[AspNetCacheProfile("CacheFor5Minutes")] 
List<ForJson.Asset> AssetList(int? userId); 

Répondre

0

Le soultion était d'ajouter userId comme veryByParam dans web.config

<add name="CacheFor5MinutesByUser" duration="300" varyByParam="userId" sqlDependency="AssetsSystem:Users;AssetsSystem:Assets"/>