URL Sharepoint Rest Query中的保留符号(&,/等) - 错误请求

时间:2012-09-24 19:29:27

标签: c# sharepoint rest odata

过去几周我一直面临的一个问题是尝试在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值(注意:转换为&amp;到%27仍然会导致错误的请求错误)之后,没有任何有效内容返回。

2 个答案:

答案 0 :(得分: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应用程序将更安全。

答案 1 :(得分:0)

I found this article它给了我一个主意。我打算尝试使用HEX,但由于我使用的是Web服务,我无法解决任何问题。最后我想,嘿,有人说他们如何使用substringof,为什么不尝试startwith!

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

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查询方法,还有另一种选择。 See MSDN Article

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

现在我将实现link posted from Mark Stafford并解析保留字符。