WCF GET URL 길이 제한 문제: 잘못된 요청 - 잘못된 URL
저는 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%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%22g1@e.cm%22,%22ID%22%7C%2228%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%22g2@gogle.com%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%22g@go.com%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"|"g1@e.cm","ID"|"28","TypeID"|"1"},{"EmailAddress"|"g2@gogle.com","ID"|"29","TypeID"|"1"},{"EmailAddress"|"g@go.com","ID"|"29","TypeID"|"1"}]/{}/481
내 매개 변수는 Json Objects의 집합입니다.저는 어떤 문자도 문제를 일으킨다고 생각하지 않습니다. 왜냐하면, 제가 몇 개의 영숫자를 제한 이하로 줄이면, 효과가 있기 때문입니다.
Windows 8 Professional의 Visual Studio 2012 Premium에서 애플리케이션을 실행하고 있습니다.NET 4.5 및 IIS Express가 함께 제공됩니다.
추가 연구
제가 이것을 더 조사하려고 할 때, 이것은 제가 이미 언급한 전체 url 길이의 제한이 아닙니다.단, 각 파라미터의 길이는 260자로 제한됩니다.
그래서 URL 전체 길이는 잘 모르겠지만 "/"로 구분된 각 매개변수는 한계가 있습니다.제가 올린 위 URL의 문제는 아래와 같이 이메일 주소 JSON 파라미터의 길이가 261자라는 것입니다.
[{"EmailAddress"|"gen1@dfs","ID"|"26","TypeID"|"1"},{"EmailAddress"|"gen2@jfasd","ID"|"27","TypeID"|"1"},{"EmailAddress"|"g1@e.cm","ID"|"28","TypeID"|"1"},{"EmailAddress"|"g2@gogle.com","ID"|"29","TypeID"|"1"},{"EmailAddress"|"g@go.com","ID"|"29","TypeID"|"1"}]
여기서 한 글자를 삭제하면 됩니다.
브라우저 제한입니까?OS 제한?
업데이트: 솔루션
저는 이것에 대해 더 연구할 때 저에게 효과적인 해결책을 찾았습니다.이 질문을 접한 다른 분들에게 도움이 될 수도 있어서 업데이트합니다.
IIS 설정입니다.
문제는 REST url의 각 매개 변수의 기본 문자 제한이 레지스트리에 정의된 260이기 때문입니다.
따라서 레지스트리를 업데이트하여 IIS 서버/IIS Express가 실행되는 위치에서 이 크기 제한을 늘려야 합니다.
다음은 레지스트리의 위치입니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters
값 은 그고값이은름리은▁and이름입니다.UrlSegmentMaxLength없는 경우 유형을 사용하여 다음 항목을 만듭니다.REG_DWORD 다값을더높지니다합정게음▁for▁higher▁value▁a에 더 높은 값을 합니다.value data예를 들어 16진수로 1000 또는 10진수로 4096입니다.
이것은 http.sys 설정입니다.http.http 설정에 대한 자세한 내용은 http://support.microsoft.com/kb/820129 을 참조하십시오.
레지스트리 변경 사항을 적용하려면 서버/컴퓨터를 다시 시작해야 합니다.그리고 이것이 마지막입니다.
일부 사용자는 응답 섹션으로 바로 이동할 수 있으므로 업데이트를 응답으로 다시 게시합니다.
저는 이것에 대해 더 연구할 때 저에게 효과적인 해결책을 찾았습니다.이 질문을 접한 다른 분들에게 도움이 될 수도 있어서 업데이트합니다.
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.http 설정에 대한 자세한 내용은 http://support.microsoft.com/kb/820129 을 참조하십시오.
레지스트리 변경 사항을 적용하려면 서버/컴퓨터를 다시 시작해야 합니다.그리고 이것이 마지막입니다.
고려해야 할 몇 가지 사항:
GET를 사용하여 데이터를 저장하지 말고 가능하면 POST를 사용해야 합니다.주된 이유는 보안과 관련이 있습니다.GET를 사용하면 더 많은 잠재적인 CSRF 공격을 받을 수 있습니다.POST는 CSRF에 면역이 되지 않지만, 이를 사용하면 취약성이 다소 감소한다는 점에 유의하십시오.
URL을 보면 쉼표가 제 눈에 맞지 않아 보이고, 잘못된 URL 오류가 발생하는 이유일 수 있습니다.
어떤 버전의 IIS에서 실행 중입니까?최대 URL 길이를 늘리기 위해 수행해야 할 작업이 결정될 수 있습니다.
IIS7의 경우 시스템에 추가할 수 있습니다.구성 파일의 웹:
<httpRuntime maxUrlLength="2000" />
편집:
파일 시스템에 매핑하지 않으므로 POST로 다시 변경해야 합니다.
MSDN에서 Windows API는 260만 허용합니다.
윈도우즈 API에서 경로의 최대 길이는 MAX_PATH이며 260자로 정의됩니다.로컬 경로는 드라이브 문자, 콜론, 백슬래시, 백슬래시로 구분된 이름 구성 요소 및 종료 null 문자 순서로 구성됩니다.예를 들어 드라이브 D의 최대 경로는 "D:\some 256자 경로 문자열"이며, 여기서 ""는 현재 시스템 코드 페이지에 대한 보이지 않는 종료 null 문자를 나타냅니다.(여기서 < > 문자는 시각적 명확성을 위해 사용되며 유효한 경로 문자열에 포함될 수 없습니다.)
완전성을 위해 다른 답변을 추가합니다.저의 경우 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
regestry를 편집함으로써 불량 Request 400의 문제를 해결했지만, 제가 추가할 때까지 작동하지 않습니다.
<httpRuntime maxUrlLength="6144" relaxedUrlToFileSystemMapping="true" />
참고로 내 레지스트리를 편집하기 전에 이 구성을 추가하려고 했지만 작동하지 않아서 레지스트리를 편집하고 이 구성으로 잘 설정했습니다. 다른 사람에게 도움이 되기를 바랍니다.
위의 솔루션은 다음과 같은 이점을 제공했습니다.
maxQueryStringLength="3000" maxUrlLength="3000"
그리고 위의 레지스트리 수정.
언급URL : https://stackoverflow.com/questions/15004232/wcf-get-url-length-limit-issue-bad-request-invalid-url
'programing' 카테고리의 다른 글
| MySQL 데이터베이스에 신용카드 정보를 저장하시겠습니까? (0) | 2023.09.05 |
|---|---|
| 아이폰으로 서버에 사진을 업로드하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
| PowerShell에서 문자열을 안전하게 bool로 변환 (0) | 2023.08.31 |
| 표 성능 대보기 (0) | 2023.08.31 |
| Laravel 4에서 원시 SQL 쿼리 이스케이프 (0) | 2023.08.31 |