使用WCF通过网络传递查询表达式

本文关键字:查询 查询表 表达式 网络 WCF 使用 | 更新日期: 2023-09-27 18:09:53

我想实现一些像WCF OData提供程序,但使用netttcpbinding而不是WebHttpBinding/REST。我希望客户端能够编写透明序列化并发送到服务器(或者可能是多个服务器,以合并分布式数据库实例)的linq查询。

其中一种方法是实现一个自定义的IQueryable提供者。可以(至少)以两种方式传递查询表达式:

1)将表达式序列化为xml,发送,并在服务器上反序列化

2)将原始SQL的前身以DataContracts

的形式传递给服务器

1很困难,而且工作量很大,而2显然会带来安全风险(sql注入)。例如,一个'Where'表达式被封装并像这样传递给服务器,

[DataContract]
public class WhereFilter
{
    [DataMember]
    public string Property { get; set; }
    [DataMember]
    public string Operation { get; set; }
    [DataMember]
    public string Value { get; set; }
}

上面的语句最终代表了SQL查询中"Where [SomeColumn] = 'SomeValue'"的部分。

我的问题是,WCF客户机-服务器连接是否足够安全,以保证这种方法不会带来太多的安全风险?或者,如果有任何其他方法可以通过netttcpbinding实现类似于odata的提供程序,我会很感兴趣。

使用WCF通过网络传递查询表达式

我将从尝试表达式树序列化项目开始。它的目的是允许表达式序列化,但我还没有使用它来评论它的工作效果。

如果做不到这一点,那么您可以使用DataContract构造查询。这是有风险的,但你总是可以通过数据库权限排除不需要的操作(例如UPDATEDELETEUserRole表)。你的WCF服务应该用一个专用的帐户连接到数据库,并且该帐户应该只有权限做它需要做的事情(没有CREATEDROP,只有SELECT从相关表,等等)。

当然,你也可以保护你的WCF连接,以停止不需要的连接(参见WCF安全概述)。一种选择是要求证书认证——只有那些拥有相关证书的用户才能使用该服务。