Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如何使用WebRequest和WebResponse使用缓存控制?_C#_.net_Asp.net Web Api_Microservices - Fatal编程技术网

C# 如何使用WebRequest和WebResponse使用缓存控制?

C# 如何使用WebRequest和WebResponse使用缓存控制?,c#,.net,asp.net-web-api,microservices,C#,.net,Asp.net Web Api,Microservices,想象一下微服务体系结构中的许多服务。服务A从服务B请求响应,服务B将缓存控制标题设置为公共,最大年龄=78261 是否有一种.NET方法可以处理请求的对象和某种“缓存”对象 人们可能认为在WebResponse或HttpWebResponse类中应该/将会有一个Cache属性,与Cache控件头接口 是否真的有必要解析缓存控制字符串、查找值并手动实现对标头的支持?服务B表示,如果您通过CDN(边缘缓存)转发请求,则其数据可以缓存在任何位置,例如任何下游代理服务器上。然后,对服务B的后续请求将由边

想象一下微服务体系结构中的许多服务。服务A从服务B请求响应,服务B将
缓存控制
标题设置为
公共,最大年龄=78261

是否有一种.NET方法可以处理请求的对象和某种“缓存”对象

人们可能认为在
WebResponse
HttpWebResponse
类中应该/将会有一个
Cache
属性,与
Cache控件
头接口


是否真的有必要解析
缓存控制
字符串、查找值并手动实现对标头的支持?
服务B表示,如果您通过CDN(边缘缓存)转发请求,则其数据可以缓存在任何位置,例如任何下游代理服务器上。然后,对服务B的后续请求将由边缘缓存完成,并且不会在源位置执行代码来检索下一个请求的数据

这应该与服务A的关注点分开考虑,服务A可能希望在向服务B发出另一个请求之前将响应数据缓存一段时间

您希望最大限度地降低进程间通信的成本(HTTP调用、服务A->服务B)以及所需的序列化/反序列化工作

这里的一种常见模式是直通式缓存,其中服务A将检查来自某个操作的缓存响应,然后再决定回调服务B(它仍然可以使用边缘缓存数据进行响应)

服务A应该决定它的缓存策略,在基于实例的MemoryCache或共享缓存(例如Redis)中缓存响应的时间。服务B可能正在返回有关某个有用对象的数据,因为它的内容以某种形式序列化—“A”应该反序列化并缓存此响应

我会将这些服务的缓存要求分开,不要使用最大年龄值来决定在服务A中缓存响应的时间。这将在服务之间引入耦合-如果服务B的设计者更改了最大年龄值,那么这将影响服务A的行为

相反,请为服务a设置一个配置值,该值定义缓存来自服务B的响应的时间长度,并使用该值来设计直通式缓存实现。将来自服务B的反序列化响应在缓存中存储一段时间


NB-我引用了来自和的图像

服务B表示它的数据可以缓存在任何地方,例如,如果您通过CDN(边缘缓存)转发请求,则可以缓存在任何下游代理服务器上。然后,对服务B的后续请求将由边缘缓存完成,并且不会在源位置执行代码来检索下一个请求的数据

这应该与服务A的关注点分开考虑,服务A可能希望在向服务B发出另一个请求之前将响应数据缓存一段时间

您希望最大限度地降低进程间通信的成本(HTTP调用、服务A->服务B)以及所需的序列化/反序列化工作

这里的一种常见模式是直通式缓存,其中服务A将检查来自某个操作的缓存响应,然后再决定回调服务B(它仍然可以使用边缘缓存数据进行响应)

服务A应该决定它的缓存策略,在基于实例的MemoryCache或共享缓存(例如Redis)中缓存响应的时间。服务B可能正在返回有关某个有用对象的数据,因为它的内容以某种形式序列化—“A”应该反序列化并缓存此响应

我会将这些服务的缓存要求分开,不要使用最大年龄值来决定在服务A中缓存响应的时间。这将在服务之间引入耦合-如果服务B的设计者更改了最大年龄值,那么这将影响服务A的行为

相反,请为服务a设置一个配置值,该值定义缓存来自服务B的响应的时间长度,并使用该值来设计直通式缓存实现。将来自服务B的反序列化响应在缓存中存储一段时间


NB-我引用了来自和的图像

+1详细回答,但我不确定它是否解决了这个问题。在回答中,您假设“客户机”将使用
foo
,而
服务A
是一个代理。但事实并非如此<代码>服务A需要在不干扰或不与任何客户端交互的情况下消耗
服务B
中的资源。客户端将使用
服务A
中的资源,但不知道
Foo
,而是使用与
Foo
相关但类型不同的
Bar
。没有客户端干扰的通信。我在问
服务A
将如何在从
服务B
检索的对象上使用缓存控制。我假设服务A和服务B之间进行直接HTTP通信,但突出显示web代理将遵守您设置的缓存头的方式。我还试图证明它们应该被视为独立的东西——服务B的缓存控制头应该只用于HTTP缓存的预期目的,服务A不应该使用该值,否则会在服务之间引入耦合。我的建议是不要在Service-A中的缓存逻辑中使用缓存控制头,让Service-A维护一个指示这一点的配置值,而不是ServiceBAlright,因此基本上您关于如何在Service-to-Service体系结构中使用缓存控制的答案是:不要+1详细的回答,但我不确定它是否解决了这个问题。在您的回答中,您假设“客户”