jquery 최대 WCF URL 길이 제한 문제:잘못된 요청-잘못된 URL




url 최대 길이 (4)

위의 솔루션은 다음과 같이 나를 위해 일했습니다.

maxQueryStringLength = "3000"maxUrlLength = "3000"

그리고 위의 레지스트리 수정.

GET 메서드를 사용하여 jQuery AJAX 호출을 통해 WCF 서비스에 액세스하려고했습니다. 따라서 URL이 매개 변수와 함께 길 경우가 있습니다.

매개 변수가 너무 길어지면 jQuery AJAX 호출이 실패하고 아무 것도 반환하지 않습니다. 그래서 나는 중단 점을 넣고 URL을 테스트 해 보았다. 브라우저에서 동일한 URL (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%[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 객체로 설정됩니다. 어떤 문자도 문제를 일으키지 않는다고 생각합니다. 왜냐하면 제한된 수의 문자로 숫자를 줄이면 작동합니다.

Windows 8 Professional의 Visual Studio 2012 Premium에서 응용 프로그램을 실행 중이므로 .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 제한 사항?

업데이트 : 솔루션

나는 이것에 대해 더 연구 할 때 저에게 도움이되는 해결책을 찾았습니다. 나는이 질문을 우연히 본 다른 사람들에게 유용 할 수 있기 때문에 여기에서 업데이트 할 예정입니다.

이것은 IIS 설정입니다.

문제는 REST url의 각 매개 변수의 기본 글자 수 제한이 레지스트리에 정의 된 260입니다.

따라서 IIS 서버 / IIS Express가 실행되는이 크기 제한을 늘리려면 레지스트리를 업데이트해야합니다.

다음은 레지스트리의 위치입니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters

값 이름은 UrlSegmentMaxLength 입니다. 존재하지 않으면 REG_DWORD 유형으로 REG_DWORD 만듭니다. 그리고 16 진수로 1000 또는 10 진수로 4096과 같이 value data 더 높은 값을 지정하십시오.

http.sys 설정입니다. http.sys 설정에 대한 추가 정보 : http://support.microsoft.com/kb/820129

레지스트리 변경 사항을 적용하려면 서버 / 시스템을 다시 시작하십시오. 그리고 그게 다야.


완전성을 위해 다른 대답을 추가하십시오. 필자의 경우 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 서버 중 하나에서 400 오류가 계속 발생했습니다. 더 많은 조사와 구성 비교가 끝나자 UrlScan IIS 모듈이 문제였습니다. 모듈을 제거하거나 최대 길이 값을 수정하기 위해 UrlScan.ini 파일을 편집하면 문제가 해결되었습니다.

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

생각할 몇 가지 사항 :

1) GET을 사용하여 데이터를 저장하지 말고 가능한 경우 POST를 사용하십시오. 주된 이유는 보안과 관련이 있습니다. GET을 사용하면 CSRF 공격 가능성이 높아집니다. POST는 CSRF의 영향을받지 않지만,이 취약점을 사용하면 취약점이 다소 감소됩니다.

2) URL을 보면 쉼표가 제자리를 찾지 못해 잘못된 URL 오류가 발생했을 수 있습니다.

3) 실행중인 IIS 버전은 무엇입니까? 이렇게하면 최대 URL 길이를 늘리기 위해해야 ​​할 일이 결정될 수 있습니다.

IIS7의 경우 구성 파일의 System.Web에 추가 할 수 있습니다.

<httpRuntime maxUrlLength="2000" />

편집하다:

파일 시스템에 맵핑하지 않으므로 다시 POST로 변경해야합니다.

MSDN 에서 Windows api는 260 만 허용합니다.

Windows API에서 (다음 단락에서 설명하는 몇 가지 예외가 있음) 경로의 최대 길이는 260 자로 정의 된 MAX_PATH입니다. 로컬 경로는 드라이브 문자, 콜론, 백 슬래시, 백 슬래시로 구분 된 이름 구성 요소 및 종료 null 문자 순서로 구성됩니다. 예를 들어, D 드라이브의 최대 경로는 "D : \ some 256-character path string"입니다. 여기서 ""는 현재 시스템 코드 페이지의 보이지 않는 종료 널 문자를 나타냅니다. (<> 문자는 시각적으로 명확하게하기 위해 여기에 사용되며 유효한 경로 문자열의 일부가 될 수 없습니다.)


regestry를 편집하면 나쁜 Request 400의 문제를 해결했지만 추가 할 때까지는 stil이 작동하지 않습니다.

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

참고로 내가 regestry를 편집하기 전에이 구성을 추가하려고했지만 Regensry를 편집 한 후 제대로 설정되지 않았기 때문에이 설정을 잘 설정했습니다. 그것은 다른 사람을 도울 수 있습니다.







get