2

過去数週間、私が何度も直面してきた問題の 1 つは、SharePoint でリスト アイテムの値を検索しようとして、不正な要求エラーが発生し続けることでした。問題の原因となっている 2 つの記号がありました。1 つは anh & 記号で何かを検索できなかったことで、もう 1 つは / (スラッシュ) でした。

私のコードは次のようになりました:

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 をどのように使用したかを述べたので、beginswith を試してみませんか! と思いました。

ついに!この問題の解決策。

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 に答える