2012-03-06 5 views
2

나는이 같은 방법 갖는 REST의 웹 서비스 쓰고 있어요 : 내가 전화를한다면REST의 웹 서비스 "잘못된 요청"

[WebGet(
    UriTemplate = "/Test/{p1}/{p2}", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    ResponseFormat = WebMessageFormat.Xml)] 
public string Test(string p1, string p2) 
{ 
    // Do something here 
} 

basurl/Test/prova/test 내 방법 TestP1 = "PROVA"(P2)를 호출 = "test" 그리고 모든 것이 잘 동작합니다. - 잘못된 요청 나는 basurl/Test/prova/te%25st를 호출 할 때조차, URL 코드에 번역 나는
Errore HTTP 400을 얻을 : 나는 PARAM (예를 들어)를 갖는 % 문자를 사용하려고하면
문제가 온다.

내가

[WebGet(
    UriTemplate = "/Test/{p1}?p2={p2}", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    ResponseFormat = WebMessageFormat.Xml)] 
public string Test(string p1, string p2) 
{ 
    // Do something here 
} 

을 사용하고 작동 basurl/Test/prova?p2=te%25st를 호출하는 경우.
왜? 첫 번째 구문을 작동 시키려면 어떻게해야합니까?

업데이트 :
가능한 해결책을 찾으십시오.
사람이 더 좋은 사람을 찾으면 게시하십시오!
덕분에 난 그냥이 링크를 발견했습니다 주위에 인터넷 검색을

답변

1

:

ASP.NET 제한 :

를 커널 모드에 의해 강화 된 제한을 통과 한 후 그들이 말하는 http://weblogs.asp.net/imranbaloch/archive/2010/04/23/understanding-400-bad-request-exception.aspx 을 http.sys 그런 다음 요청을 IIS에 전달한 다음 ASP.NET 엔진으로 전달한 다음 다시 요청하면 ASP.NET에서 일부 제한을 통과해야합니다. 그것을 성공적으로 채워라.

ASP.NET에서는 URL 경로 길이를 260 자까지만 허용합니다 (예 : http://a/b/c/d, 경로는 a에서 d). 이 은 길이가 261 자의 경로가있는 경우 에 잘못된 요청 예외가 발생 함을 의미합니다. 이것은 NTFS 파일 경로 제한 때문입니다.

또 다른 제한 사항은 URL 경로 부분에 문자를 사용할 수 있다는 것입니다. 일부 문자 을 제외한 모든 문자는 경로에서 유효하지 않은 문자로 사용할 수 있습니다. 다음은 URL의 경로 부분에 잘못된 문자가 포함되어 있습니다. <>, *, %, &, :, \ ,?. 솔루션 탐색기를 마우스 오른쪽 버튼으로 클릭하고 새 폴더를 추가하고 위의 문자 중 하나에이 파일의 이름을 지정하면 메시지가 표시됩니다. 파일 또는 폴더는 빈 문자열 일 수 없으며 에만 '.' 또는 다음 문자 중 하나가 .....

위의 상황을 확인하기 위해 웹 응용 프로그램을 만들고 Default.aspx를 % A 폴더에 넣은 다음 ( Windows 탐색기에서 작성) http://localhost:1234/A%25A/Default.aspx, 서버의 응답이 잘못된 요청 예외입니다.그 이유는 % 25가 ASP.NET에서 유효하지 않은 URL 경로 문자 인 문자이기 때문입니다. 그러나 쿼리 문자열에서 이러한 문자를 사용할 수 있습니다.

이러한 제한의 이유는 보안 덕분입니다. 예를 들어 URL 경로 부분 인 을 두 번 인코딩 할 수 있고 % : 서버에서 특정 리소스를 얻는 데 사용됩니다.

그래서 내 문제를 해결하는 것이 불가능하다고 생각하기 시작했습니다.
나는이 문제가 PHP로 작성된 일부 REST webservice에는 존재하지 않으며 Apache와 함께 호스팅되어 있으므로 IIS/ASP "보안"제한으로 해결할 수 없다고 생각합니다.

최종 해결사로 업데이트 :
해결책을 찾았습니다. here : 모든 것을 이해하는 기사를 읽었습니다.
위험 할 수 있으므로 사용하기 전에 잘 생각해야합니다.

<system.web> 
    <httpRuntime requestPathInvalidCharacters="" /> 
    <pages validateRequest="false" /> 
</system.web>