2013-02-21 3 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 변경이 필요하기 때문입니다.

편집

나는 오류를 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 (Windows 8 Professional)에서 응용 프로그램을 실행 중이므로 .NET 4.5 및 IIS Express가 포함되어 있습니다.

또한 연구

I 조사하기를 시도, 이것은 전체 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 : 솔루션

은 내가 이것에 더 연구 할 때, 나를 위해 일한 해결책을 발견. 나는이 질문을 우연히 본 다른 사람들에게 유용 할 수 있기 때문에 여기에서 업데이트 할 예정입니다.

이것은

REST URL에 포함 된 각 매개 변수의 기본 문자 제한은 레지스트리에 정의되어 260, 때문에 문제는 설정는 IIS입니다.

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

레지스트리의 위치입니다 :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters 

그리고 값 이름은 UrlSegmentMaxLength입니다. 그곳에 없으면, 유형이 REG_DWORD 인 것을 작성하십시오. 그리고 value data에 대해 더 높은 값을 지정하십시오 (예 : 1000은 16 진수, 4096은 10 진수).

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

레지스트리 변경 사항을 적용하려면 서버/시스템을 다시 시작하십시오. 그게 전부입니다. 당신은 데이터의 저장을 가능하면 POST를 사용하려면 GET을 사용해서는 안

1) :

+1

"업데이트 : 해결책"이 효과적입니다. Fimas, 만약 당신이 아직도 주위에, 당신이 대답으로 질문의 해당 섹션을 게시하려면, 나는 행복하게 그것을 upvote 줄. –

+1

물론입니다. 다행히도 내 솔루션이 저에게 효과적이었습니다. :) – Firnas

+0

업데이트 솔루션이 작동합니다. 이것은 PHP 5.6 및 Server 2012 R2와 함께 계속 작동합니다. – FunkeDope

답변

8

일부 사용자는 정답 섹션으로 바로 넘어갈 수 있으므로 답변을 답변으로 다시 게시하십시오.

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

이것은 REST URL에 포함 된 각 매개 변수의 기본 문자 제한은 레지스트리에 정의되어 260, 때문에 문제가

설정는 IIS입니다.

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

레지스트리의 위치를 ​​다음과 같은 : 매개 변수 \ \ CurrentControlSet \ Services에

HKEY_LOCAL_MACHINE을 \ 시스템 \ HTTP 및 값 이름은 UrlSegmentMaxLength입니다. 존재하지 않으면 REG_DWORD 유형으로 계정을 만듭니다. 그리고 16 진수로 1000 또는 10 진수로 4096과 같이 값 데이터에 더 높은 값을 지정하십시오.

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

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

2

몇 가지에 대해 생각합니다. 주된 이유는 보안과 관련이 있습니다. GET을 사용하면 CSRF 공격 가능성이 높아집니다. POST는 CSRF의 영향을받지 않지만,이 취약점을 사용하면 취약점이 다소 감소됩니다.

2) URL을 보면 쉼표가 잘못된 것으로 보이며 잘못된 URL 오류가 발생했을 수 있습니다.

3) 실행중인 IIS 버전은 무엇입니까? 이렇게하면 최대 URL 길이를 늘리기 위해해야 ​​할 일이 결정될 수 있습니다. 당신은 설정 파일에 경우 System.Web 추가 할 수 IIS7를 들어

:

<httpRuntime maxUrlLength="2000" /> 

편집 :

그것을 매핑 시도하지 않습니다대로 다시 POST로 변경하려고한다 파일 시스템에.

MSDN에서 Windows API는 윈도우 API에서 260

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

+0

편집을 참조하십시오. 추가 연구 정보가 추가되었습니다. – Firnas

+0

많은 양의 데이터를 제출하려면 GET 대신 POST를 사용하는 것에 동의합니다. – Firnas

0

:

maxQueryStringLength = "3000"maxUrlLength = "3000"

그리고 레지스트리 위의 수정. 그것은 나쁜 요청 (400)의 내 문제를 해결했다,하지만 난이 추가 될 때까지 STIL 나를 위해 작동하지 않는 regestry을 편집하여

1

, 참고

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

내가 내 regestry를 편집하기 전에이 구성을 추가 tryed하지만, 그것은 Regestry를 편집 한 후이 설정으로 잘 설정 한 것 같아서 작동하지 않았다. 다른 사람에게 도움이 될 수 있습니다.

1

완전성을 위해 다른 답변을 추가하십시오. 필자의 경우 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