0

我一直在尝试编写一个简单的小 Cmdlet 来允许我设置/获取/删除缓存项。我遇到的问题是我无法弄清楚如何连接到本地缓存集群。

我尝试添加通常的 app.config 内容,但似乎没有被采纳...

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="dataCacheClient" type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowLocation="true" allowDefinition="Everywhere" />
  </configSections>
  <dataCacheClient>
    <hosts>
      <host name="localhost" cachePort="22233" />
    </hosts>
  </dataCacheClient>
</configuration>

我宁愿根本没有那个配置。所以我真正要问的是以下powershell的等效C#代码是什么......

Use-CacheCluster

Use-CacheCluster如果没有提供参数,我可以收集到的连接到本地集群

4

2 回答 2

1

我刚刚使用 Reflector 对 AppFabric Powershell 代码进行了一些深入研究,以了解它在幕后是如何工作的。如果您Use-CacheCluster在没有参数的情况下调用,例如本地集群,代码会从 Registry key 中读取连接字符串和提供者名称HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AppFabric\V1.0\Configuration。不幸的是,它随后使用这些值来构建一系列都标记为内部的类(ClusterConfigElementCacheAdminClusterHandler,因此您不能使用它们来获取 Powershell 正在工作的当前集群上下文(因为需要更好的词)和。

那么,为了使您的 Cmdlet 工作,我认为您需要传入一个主机名(这将是集群中的服务器之一,也许您可​​以将其默认为本地机器名称)和端口号(您可以默认到 22233),并使用这些值来构建一个DataCacheServerEndpoint传递给您的DataCacheFactory例如

[Cmdlet(VerbsCommon.Set,"Value")]
public class SetValueCommand : Cmdlet
{
    [Parameter]
    public string Hostname { get; set; }
    [Parameter]
    public int PortNumber { get; set; }
    [Parameter(Mandatory = true)]
    public string CacheName { get; set; }

    protected override void ProcessRecord()
    {
        base.ProcessRecord();

        // Read the incoming parameters and default to the local machine and port 22233
        string host = string.IsNullOrWhiteSpace(Hostname) ? Environment.MachineName : Hostname;
        int port = PortNumber == 0 ? 22233 : PortNumber;

        // Create an endpoint based on the parameters
        DataCacheServerEndpoint endpoint = new DataCacheServerEndpoint(host, port);

        // Create a config using the endpoint
        DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration();
        config.Servers = new List<DataCacheServerEndpoint> { endpoint };

        // Create a factory using the config
        DataCacheFactory factory = new DataCacheFactory(config);

        // Get a reference to the cache so we can now start doing useful work...
        DataCache cache = factory.GetCache(CacheName);
        ...
    }
}
于 2012-07-26T12:09:04.420 回答
0

问题是调用: DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration();

在 Cmdlet 方法内部会产生一个听起来像“无法初始化 DataCacheFactoryConfiguration”的错误。

于 2013-08-08T05:09:00.267 回答