1

WCF Restful Webservice 似乎以某种方式缓存 LINQ 数据对象。

Web 服务是基于 .NET 4.0 构建的 WCF Restful 服务,目前在我的本地 ASP.net 开发服务器中运行。

我有一个 MSSQL 2008 数据库,其中包含 Web 服务使用 LINQ 进行验证的一系列有效 IP 地址。根据数据库中可接受的 IP 范围验证客户端 IP 的机制在独立测试中成功运行。

场景:客户端 IP 为 127.0.0.1 有效 IP 范围为:127.0.0.0 到 127.0.0.5

我从 Fiddler 向 web 服务执行了一个 GET 请求,它通过给我一个不错的 200 状态代码来正常工作。然后我将数据库中的范围更改为 127.0.0.0 到 127.0.0.0 并且当我应该收到 401 状态码时仍然收到 200 状态码。然后我转到 Visual Studio 并简单地保存一个文件(没有任何修改)并返回到 Fiddler 并重新发出请求,我现在得到了所需的 401 状态代码。

在 Web 服务中,我将 Cache-Control 和 Pragma 标头设置为响应中存在的“no-cache”:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 30 Jul 2010 16:12:56 GMT
X-AspNet-Version: 4.0.30319
Pragma: no-cache
Content-Length: 1121680
Cache-Control: no-cache
Content-Type: application/xml; charset=utf-8
Connection: Close

或者..

HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 30 Jul 2010 16:26:48 GMT
X-AspNet-Version: 4.0.30319
Pragma: no-cache
Content-Length: 88
Cache-Control: no-cache
Content-Type: application/xml; charset=utf-8
Connection: Close

在我看来,LINQ 进程中的某些东西正在缓存它最初从第一个请求返回的数据,并且不会为每个后续请求返回数据库。一旦我在 web 服务上保存任何文件,它会导致重新编译服务,从而执行另一个查找以获取数据。

4

1 回答 1

0

您是否能够直接测试您的 LINQ-to-SQL 调用,而无需通过 Web 服务,只是为了验证 LINQ-to-SQL 是否正在为您执行缓存?

此外,这里有一个与您的问题类似的问题的链接,要求您禁用对象跟踪。您的数据上下文中此属性的默认值为true. 帖子的相关部分:

您的解决方案是像这样禁用数据上下文的对象跟踪(LINQ 缓存)。 myContext.ObjectTrackingEnabled = false;

希望这可以帮助!

于 2010-07-30T16:56:42.933 回答