2

在过去的几周里,我一直面临的一个问题是尝试在 SharePoint 中搜索列表项值并不断收到错误的请求错误。我有两个导致问题的符号,一个是我无法搜索带有 anh & 符号的东西,另一个是 /(正斜杠)。

我的代码看起来像:

ServiceContext context = new ServiceContext(new Uri("http://URL/_vti_bin/listdata.svc"));
    context.Credentials = CredentialCache.DefaultCredentials;
    var requestType = (System.Data.Services.Client.DataServiceQuery<ListTypeValue>)context.ListType
        .Where(v => v.Value.Equals(search));

搜索互联网后,除了说更改 IIS 设置或将其转换为 ASCII Html 值(注意:将 & 转换为 %27 仍然会导致错误的请求错误)之外,没有返回任何有效信息。

4

2 回答 2

2

我真的不建议使用 StartsWith 和 Length 的组合——在这种情况下,性能可能会成为一个真正的问题。假设您需要一个字符串键并且您希望您的键能够包含特殊字符,Peter Qian 在博客中介绍了我们可以给出的最佳建议。(此行为实际上来自 IIS 和 .NET 堆栈的组合。)

查看http://blogs.msdn.com/b/peter_qian/archive/2010/05/25/using-wcf-data-service-with-restricted-characrters-as-keys.aspx了解更多详情,但您的问题应该通过关闭 ASP.NET 请求过滤来解决。请注意,这具有重要的安全风险。Peter 指出了其中一些,asafaweb.com 等安全过滤工具会抱怨这种解决方案。

长话短说:如果您可以使用整数或避免键中的受限字符,您的 Web 应用程序将更加安全。

于 2012-09-24T21:12:01.773 回答
0

我找到了这篇文章,它给了我一个想法。我打算尝试使用 HEX,但由于我使用的是 Web 服务,所以我什么也想不通。最后我想,嘿,有人说他们是怎么用substringof的,为什么不试试startswith呢!

最后!这个问题的一个解决方案。

INVALID:
http://URL/_vti_bin/listdata.svc/ListType('Search & Stuff')

VALID:
http://URL/_vti_bin/listdata.svc/ListType() $filter=startswith(Value,'Search & Stuff')

我更进一步,因为这可能会返回不是我想要的。我添加的长度等于字符串长度,它工作得很好!

我的 C# 代码现在看起来像这样:

ServiceContext context = new ServiceContext(new Uri("http://URL/_vti_bin/listdata.svc"));
context.Credentials = CredentialCache.DefaultCredentials;
var requestType = (System.Data.Services.Client.DataServiceQuery<ListTypeValue>)context.ListType
    .Where(v => v.Value.StartsWith(search) && v.Value.Length == search.Length);

希望这可以帮助其他人并节省一些头发拉扯!


更新:

在得到人们的回复后,我找到了一个更好的方法来做到这一点。除了标准的 LINQ 查询方法之外,还有另一种选择。请参阅 MSDN 文章

System.Data.Services.Client.DataServiceQuery<ListTypeValue> lobtest = context.ListType
    .AddQueryOption("$filter", "(Value eq '" + CleanString(search) + "')");

现在我将实现从 Mark Stafford 发布的链接并解析出保留字符。

于 2012-09-24T19:29:27.073 回答