web-dev-qa-db-ja.com

WCF GET URLの長さ制限の問題:不正なリクエスト-無効なURL

JQuery AJAX GETメソッドを使用した呼び出しを介してWCFサービスにアクセスしようとしました。そのため、URLがパラメーターで長くなることがあります。

パラメータが非常に長くなると、jQuery AJAX呼び出しは失敗し、何も返さないので、ブレークポイントを設定してURLを取り出してテストしました。ブラウザで同じURLを試してみると(I FireFoxとChromeを試しました)、URLの長さが長すぎると次のように返されます。

不正なリクエスト-無効なURL

HTTPエラー400。リクエストURLが無効です。

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

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

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

[〜#〜]編集[〜#〜]

エラーを生成するためにテストした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%22gen1@dfs%22,%22ID%22%7C%2226%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%22gen2@jfasd%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"|"gen1@dfs","ID"|"26","TypeID"|"1"},{"EmailAddress"|"gen2@jfasd","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オブジェクトのセットです。英数字の数を制限より少なくするだけでうまくいくので、どの文字も問題を引き起こしているとは思いません。

Windows 8ProfessionalのVisualStudio 2012 Premiumでアプリケーションを実行しているので、.NET4.5でIIS Expressが付属しています。

さらなる研究

これをさらに調査しようとすると、これはすでに述べた制限ではなく、完全なURLの長さです。ただし、各パラメーターの長さには260文字の制限があります。

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

[{"EmailAddress"|"gen1@dfs","ID"|"26","TypeID"|"1"},{"EmailAddress"|"gen2@jfasd","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の制限?

更新:ソリューション

これについてさらに調査したところ、自分に合った解決策を見つけました。この質問に出くわした他の人に役立つかもしれないので、ここで更新しています。

これはIIS設定

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

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

レジストリの場所は次のとおりです。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters

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

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

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

20
Firnas

回答セクションに直接ジャンプする可能性があるため、更新を回答として再投稿します。

これについてさらに調査したところ、自分に合った解決策を見つけました。この質問に出くわした他の人に役立つかもしれないので、ここで更新しています。

これはIIS設定

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

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

レジストリの場所は次のとおりです。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parametersそして、値の名前はUrlSegmentMaxLengthです。存在しない場合は、タイプREG_DWORDで作成します。また、値データには、16進数で1000、10進数で4096などのより高い値を指定します。

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

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

11
Firnas

考慮すべきいくつかの事柄:

1)データの保存にGETを使用しないでください。可能な場合は、POSTを使用してください。主な理由はセキュリティに関係しています。GETを使用すると、CSRF攻撃の可能性が高まります。 POSTはCSRFの影響を受けませんが、CSRFを使用すると脆弱性が少し軽減されることに注意してください。

2)URLを見ると、コンマは私には不適切に見え、無効な​​URLエラーが発生している理由である可能性があります。

3)どのバージョンのIISで実行していますか?これにより、最大URL長を増やすために何をしなければならないかが決まる場合があります。

IIS7の場合、構成ファイルでSystem.Webに追加できます。

<httpRuntime maxUrlLength="2000" />

編集:

ファイルシステムへのマッピングは試行されないため、もう一度POSTに変更してみてください。

From [〜#〜] msdn [〜#〜] WindowsAPIでは260のみが許可されます。

Windows APIでは(次の段落で説明するいくつかの例外を除いて)、パスの最大長はMAX_PATHであり、260文字として定義されています。ローカルパスは、ドライブ文字、コロン、バックスラッシュ、バックスラッシュで区切られた名前コンポーネント、および終了ヌル文字の順序で構成されます。たとえば、ドライブDの最大パスは「D:\ some256文字のパス文字列」です。「」は、現在のシステムコードページの非表示の終了ヌル文字を表します。 (ここでは、見やすくするために文字<>を使用しており、有効なパス文字列の一部にすることはできません。)

2
Chris Holwerda

完全を期すために別の答えを追加します。私の場合、web.configにすべての正しい値がありました。

    <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サーバーの1つで400エラーが発生していました。さらに調査と構成の比較を行った結果、UrlScan IISモジュールがモジュールをアンインストールするか、UrlScan.iniファイルを編集して最大長の値を変更することにより、問題は解決されました。

...
[RequestLimits]
MaxAllowedContentLength=104857600
MaxUrl=3000
MaxQueryString=3000
1

Regestryを編集することで、リクエスト400の問題を解決しましたが、追加するまでstilは機能しません。

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

注:私はレジェストリーを編集する前にこの構成を追加しようとしましたが、機能しなかったので、レジェストリーを編集した後、この構成でうまくセットアップしたと思います。それが他の誰かを助けるかもしれません。

1
Capoutcha

上記の解決策は私のために働いた:

maxQueryStringLength = "3000" maxUrlLength = "3000"

そして、上記のレジストリ修正。

0
GrahamJ