Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Azure上的ASP.NET中缓存WCF ChannelFactory或客户端代理?_C#_Asp.net_Wcf_Session_Azure - Fatal编程技术网

C# 在Azure上的ASP.NET中缓存WCF ChannelFactory或客户端代理?

C# 在Azure上的ASP.NET中缓存WCF ChannelFactory或客户端代理?,c#,asp.net,wcf,session,azure,C#,Asp.net,Wcf,Session,Azure,正如问题所说。目前,我们正在将WCF客户端代理(确切地说是ChannelFactory)缓存到每个会话的服务中。这个很好用。但现在我们已经迁移到Azure,并且有多个(会话)实例。我的AppFabric会话状态正在工作。因此,会话由Azure提供,但现在的问题是通道工厂的缓存。因为工厂不可[Serializable],因此它似乎无法存储在会话[]中。有哪些选择?是否应在每次调用WCF服务方法时重新创建通道 [1.以前的工作状态;2.新尝试的解决方案;3.回退选项] WCF客户端->ASP.NET

正如问题所说。目前,我们正在将WCF客户端代理(确切地说是ChannelFactory)缓存到每个会话的服务中。这个很好用。但现在我们已经迁移到Azure,并且有多个(会话)实例。我的AppFabric会话状态正在工作。因此,会话由Azure提供,但现在的问题是通道工厂的缓存。因为工厂不可[Serializable],因此它似乎无法存储在会话[]中。有哪些选择?是否应在每次调用WCF服务方法时重新创建通道

[1.以前的工作状态;2.新尝试的解决方案;3.回退选项]

  • WCF客户端->ASP.NET->会话缓存工厂->频道->WCF服务
  • WCF客户端->ASP.NET->无法存储工厂!->频道->Azure角色WCF服务
  • WCF客户端->ASP.NET->新频道每次呼叫->Azure角色WCF服务
  • 更新:我们已经确定,无法缓存(共享)ChannelFactory。因此,问题仍然存在,我如何共享凭据(usernamecdentials),这些凭据现在没有被共享,并且必须以某种方式分布在拆分实例中。显而易见的选择是将加密凭据存储在缓存中?这是个好主意吗?还有别的办法吗


    这是一个新问题:

    如果要缓存ChannelFactory,则每个azure角色实例的每个会话都需要一个。您认为CacheFactory不应该在会话之间共享是正确的,因为它们可能支持不同的用户

    正如您所说的,CacheFactory是不可序列化的,因此您无法将其放入分布式缓存中


    缓存它的一半原因是为了避免缓存工厂的设置时间(可能是10毫秒)。将其序列化到缓存中或从缓存中序列化可能比这还要长,因为CacheFactory的大小相当大。

    如果要缓存ChannelFactory,则每个azure角色实例的每个会话都需要一个。您认为CacheFactory不应该在会话之间共享是正确的,因为它们可能支持不同的用户

    正如您所说的,CacheFactory是不可序列化的,因此您无法将其放入分布式缓存中


    缓存它的一半原因是为了避免缓存工厂的设置时间(可能是10毫秒)。由于CacheFactory的大小相当大,因此将其序列化到缓存中或从缓存中序列化可能会更长。

    感谢您的快速响应。我同意,但是凭证存放在哪里呢?它们存储在ChannelFactory中,现在它被拆分为多个实例。它本身并不是一个真正的问题,除了可能有一点点开销。我是否应该以某种方式将凭据加密到serializable结构中,并将其存储在Azure中的会话变量中,然后共享?这安全吗(在Azure服务器上)?什么是最好的方法?@SmartK8。如果您有每个实例存储的凭据副本,这是否有问题?我认为您不需要将它们放在分布式缓存中,因为它们在实例之间共享并不重要。否?@SmartK8。不过,当我与你分享ChannelFactorys时,你对我来说有一个不同的用例。在我的情况下,我没有使用windows auth,因此不需要每个会话都有一个channelFactory(因此)。我所做的是创建一个静态字典,其中包含每个服务接口的ChannelFactory,因为我试图避免实例化ChannelFactory以允许我创建频道的每次调用的设置成本。问题是,我在另一个实例上没有它们,因此服务将无法通过安全检查。现在看起来是这样,我登录了,当我刷新页面时,它要么正确加载,要么抛出异常,这取决于哪个实例提供了它(说实话,有点滑稽)。到目前为止,我也有类似的情况。会话(用户)中存储的每个接口只有一个字典单例。在登录时提供了凭据。所以直到最后一天,这是一个类似的场景。现在不同的是需要凭据。感谢您的快速响应。我同意,但是凭证存放在哪里呢?它们存储在ChannelFactory中,现在它被拆分为多个实例。它本身并不是一个真正的问题,除了可能有一点点开销。我是否应该以某种方式将凭据加密到serializable结构中,并将其存储在Azure中的会话变量中,然后共享?这安全吗(在Azure服务器上)?什么是最好的方法?@SmartK8。如果您有每个实例存储的凭据副本,这是否有问题?我认为您不需要将它们放在分布式缓存中,因为它们在实例之间共享并不重要。否?@SmartK8。不过,当我与你分享ChannelFactorys时,你对我来说有一个不同的用例。在我的情况下,我没有使用windows auth,因此不需要每个会话都有一个channelFactory(因此)。我所做的是创建一个静态字典,其中包含每个服务接口的ChannelFactory,因为我试图避免实例化ChannelFactory以允许我创建频道的每次调用的设置成本。问题是,我在另一个实例上没有它们,因此服务将无法通过安全检查。现在看起来是这样,我登录了,当我刷新页面时,它要么正确加载,要么抛出异常,这取决于哪个实例提供了它(说实话,有点滑稽)。到目前为止,我也有类似的情况。会话(用户)中存储的每个接口只有一个字典单例。在登录时提供了凭据。所以直到最后一天,这是一个类似的场景。现在的区别是对凭证的需要。