Restful WCF 服务和 LINQ

Posted

技术标签:

【中文标题】Restful WCF 服务和 LINQ【英文标题】:Restful WCF Service and LINQ 【发布时间】:2011-03-23 08:42:12 【问题描述】:

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

Web 服务是基于 .NET 4.0 构建的 WCF Restful Service,目前在我的本地 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 服务上保存任何文件,它会导致重新编译服务并因此执行另一个查找以获取数据。

【问题讨论】:

您的数据库可以缓存结果吗?您可能想要记录并查看 LINQ 数据对象中的内容,以缩小它是在数据库层还是堆栈中更高的位置。 【参考方案1】:

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

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

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

希望这会有所帮助!

【讨论】:

我爱 ***... 将“objecttrackingenabled”属性设置为 false 解决了我的问题。非常感谢!!! 该死,我猜这会使数据成为“只读”。我还需要插入数据,以便将扳手扔进齿轮..

以上是关于Restful WCF 服务和 LINQ的主要内容,如果未能解决你的问题,请参考以下文章

RESTful 服务:WCF 与 ASP.NET MVC

WCF的Restful和TCP方式调用性能比较

WCF、RESTful Web 服务和自定义身份验证

如何对 WCF 4 RESTful 服务进行身份验证?

Restful WCF 服务和 LINQ

wcf RESTful服务和WEB API的区别