2013-02-21 6 views
16

GETメソッドを使用してjQuery AJAX呼び出しを使用してWCFサービスにアクセスしようとしました。そのため、URLにパラメータが含まれている場合があります。WCF URL長制限の問題:不正なリクエスト - 無効なURL

パラメータが非常に長くなると、jQuery AJAX呼び出しは失敗し、何も返しません。だから、私はブレークポイントを入れ、テストのためにURLを取り出しました。ブラウザで同じURLを試すと(FireFoxとChromeを試しました)、URLの長さが長すぎると、次の値が返されます。

不正な要求 - 無効なURL

HTTPエラー400要求URLが無効です。

長さの制限も確認しました。 URLの文字数(符号化形式)が1011文字(http://を含む)を超えると、エラーが発生します。

誰もが同じ状況にあり、これに対する解決策が見つかりましたか?それはWindowsの制限ですか、またはプログラムによって任意の設定で管理できますか?

POSTメソッドを試しましたが、動作させることができませんでした。 web.configの変更が必要なためです。

EDIT

私はURLのエラー

http://localhost:64973/Member.svc/SaveMemberWithDetail/%7B%22ID%22%7C%222%22,%22TypeID%22%7C%222%22,%22Title%22%7C%22Mr.%22,%22FirstName%22%7C%22Firnas%22,%22MiddleName%22%7C%22%22,%22LastName%22%7C%22Aliyar%22,%22Gender%22%7C%221%22,%22DateOfBirth%22%7C%222000-01-01%22,%22Nationality%22%7C%22Sri%20Lankan%22%7D/%5B%7B%22AddressLine1%22%7C%22Changed%20Address%20Line1%22,%22AddressLine2%22%7C%22Colombo%22,%22City%22%7C%22Colombo%2010%22,%22State%22%7C%22WP%22,%22PostCode%22%7C%2201000%22,%22CountryID%22%7C%221%22,%22ID%22%7C%227%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22Telephone%22%7C%22015154645%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2226%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2227%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2228%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D%5D/%7B%7D/481 

エンコードされていなかったバージョンを生成するためにテストされているURL:

http://localhost:64973/Member.svc/SaveMemberWithDetail/{"ID"|"2","TypeID"|"2","Title"|"Mr.","FirstName"|"Firnas","MiddleName"|"","LastName"|"Aliyar","Gender"|"1","DateOfBirth"|"2000-01-01","Nationality"|"Sri Lankan"}/[{"AddressLine1"|"Changed Address Line1","AddressLine2"|"Colombo","City"|"Colombo 10","State"|"WP","PostCode"|"01000","CountryID"|"1","ID"|"7","TypeID"|"1"}]/[{"Telephone"|"015154645","TypeID"|"1"}]/[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}]/{}/481 

私のパラメータは、JSONオブジェクトの設定されているが。私は文字のいずれかが問題を引き起こすとは思わない、なぜなら、もし私が極限未満の数の英数字しか減らさなければ、それは機能するからである。

私はVisual Studio 2012 Premium for Windows 8 Professionalでアプリケーションを実行しています。そのため、.NET 4.5とIIS Expressが付属しています。

さらに研究

私はこれをさらに調査しようとすると、これは完全なURLの長である私はすでに言及している限りではありません。しかし、各パラメータの長さには260文字の制限があります。

URLの全長はわかりませんが、各パラメータ(「/」で区切られています)には制限があります。上記の私が投稿したURLの問題は、電子メールアドレスです.JSONパラメータの長さは261文字です。

[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}] 

これより1文字削除すると動作します。

ブラウザの制限はありますか? OSの制限?

UPDATE:SOLUTION

私はこの上でさらに研究するとき、私は、私のために働いた解決策を見つけました。この質問に遭遇した他の人にとっては役に立ちそうなので、ここで更新しています。

これは、RESTのURLの各パラメータのデフォルトの文字制限は、レジストリで定義されている260で、ため、問題がある

を設定するIISです。

IISサーバー/ IIS Expressが実行されているこのサイズ制限を増やすには、レジストリを更新する必要があります。続き

は、レジストリの場所である:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters 

そして値の名前はUrlSegmentMaxLengthです。存在しない場合は、タイプがREG_DWORDのものを作成します。 value dataには、16進数で1000、小数点で4096などの高い値を指定します。

これはhttp.sysの設定です。 http.sys設定の詳細:http://support.microsoft.com/kb/820129

サーバー/マシンを再起動して、レジストリの変更を適用してください。 それだけです。

+1

"UPDATE:SOLUTION"が私のために機能しました。 Fimas、あなたがまだ周りにいる場合は、あなたの質問のセクションを回答として投稿したい場合、私はうれしくupvoteしたい。 –

+1

確かです。私の解決策が私のために働いたことを聞いてうれしい。 :) – Firnas

+0

アップデートソリューションが動作します。これはまだPHP 5.6およびServer 2012 R2で動作しています – FunkeDope

答えて

8

あなたの人の中にはAnswersセクションに直接ジャンプするかもしれないので、このアップデートをAnswerとして再投稿してください。

私はこれについてさらに研究すると、私のために働く解決策を見つけました。この質問に遭遇した他の人にとっては役に立ちそうなので、ここで更新しています。

これは、RESTのURLの各パラメータのデフォルトの文字制限は、レジストリで定義されている260で、ため、問題がある

を設定するIISです。

IISサーバー/ IIS Expressが実行されているこのサイズ制限を増やすには、レジストリを更新する必要があります。

レジストリの場所を以下に示します。パラメータ \サービス\ CURRENTCONTROLSET \

HKEY_LOCAL_MACHINE \システム\ HTTPと値の名前がUrlSegmentMaxLengthです。存在しない場合は、REG_DWORDの種類で作成します。また、16進数では1000、小数点では4096などの値データの方が高い値を指定します。

これはhttp.sysの設定です。 http.sys設定の詳細:http://support.microsoft.com/kb/820129

サーバー/マシンを再起動して、レジストリの変更を適用してください。以上です。

2

考えるカップルの事:あなたが可能な場合、POSTを使用して、データの保存を行うためにGETを使うべきではありません

1)。主な理由はセキュリティと関係しています。 GETを使用すると、潜在的なCSRF攻撃の可能性が広がります。 POSTはCSRFに対して無防備ではありませんが、これを使用することにより、脆弱性が少し軽減されることに注意してください。

2)URLを確認すると、コンマは私に間違って表示され、無効なURLエラーが発生する可能性があります。

3)実行しているIISのバージョンは?これにより、最大URLの長さを増やすために必要な作業が決まります。あなたが設定ファイルでのSystem.Webに追加することもできますIIS7のために

<httpRuntime maxUrlLength="2000" /> 

EDIT:

それをマッピングしようとしませんようあなたが再びPOSTにそれを変更してみてくださいファイルシステムに転送します。

MSDNからWindows APIは、Windows APIで260

を可能に260として定義され、パスの最大長は あるMAX_PATH、である(以下 段落で議論いくつかの例外を除いて)文字。ローカルパスは、ドライブ文字、コロン、バックスラッシュ、 バックスラッシュで区切られた名前コンポーネント、および終了ヌル文字で構成される の順番で構成されます。たとえば、ドライブDの最大パスは "D:¥256文字のパス文字列" " "です。ここで ""は現在のシステムコードページの の不可視終了ヌル文字を表します。 (文字<>は の視覚的明快さのためにここで使用されており、有効なパス文字列の一部にすることはできません。)上記の溶液は、と私のために働いた

+0

私の編集を参照してください、さらなる研究情報が追加されます。 – Firnas

+0

GETではなくPOSTを使用して、大量のデータを送信して送信することに同意します。 – Firnas

0

maxQueryStringLength = "3000" maxUrlLength = "3000"

とレジストリは、上記の修正。それは不正な要求400の私の問題を解決しますが、私が追加されるまで、STIL私のために動作しませんregestryを編集することにより、

1

、ノートの

<httpRuntime maxUrlLength="6144" relaxedUrlToFileSystemMapping="true" /> 

は私が私のregestryを編集する前にこの設定を追加するためにしようと試みたが、それは動作しませんでしたので、私はRegestryを編集した後、この設定でうまく設定しました。 他の人に役立つかもしれません。

1

完全性のために別の回答を追加する。

<system.web> 
    ... 
     <!--Make sure to keep maxAllowedContentLength and maxRequestLength are in Synch--> 
     <!--This is for ASP.NET and is in KBytes--> 
     <httpRuntime maxRequestLength="50000" maxUrlLength="3000" maxQueryStringLength="3000"/> 
    </system.web> 
... 
    <system.webServer> 
    <security> 
     <requestFiltering> 
     <!--This is for IIS7+ and is in Bytes (Equivalent to 50MB)--> 
     <requestLimits maxAllowedContentLength="52428800" maxQueryString="3000" /> 
     </requestFiltering> 
    </security> 
    </system.webServer> 
... 

は、しかし、私はまだIISサーバーのいずれかに400エラーを取得しました。私の場合は、web.configファイル内のすべての権利の値を持っていました。詳細な調査と構成の比較の後、UrlScan IISモジュールが原因であることが判明しました。モジュールをアンインストールするかUrlScan.iniファイルを編集して最大長の値を変更することで、問題は解決されました。

... 
[RequestLimits] 
MaxAllowedContentLength=104857600 
MaxUrl=3000 
MaxQueryString=3000 
関連する問題