2012-03-06 176 views
2

我在寫有這樣的方法的REST Web服務:REST Web服務「錯誤的請求」

[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方法Test被調用,P1 =「PROVA」P2 =「測試」和一切工作正常。
問題是當我嘗試使用具有(例如)設置了一個param 焦炭:連翻譯它在URL代碼,當我嘗試打電話basurl/Test/prova/te%25st我得到了
Errore HTTP 400 - 錯誤的請求。

如果我使用

[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

周圍的Googling我找到此鏈接: http://weblogs.asp.net/imranbaloch/archive/2010/04/23/understanding-400-bad-request-exception.aspx ,他們說:

ASP.NET限制:

路過內核模式實施的限制後, http.sys然後將請求傳遞給IIS,然後再引發到ASP.NET 引擎,然後再次請求必須通過一些來自 ASP.NET的限制以便com成功完成它。

ASP.NET只允許URL路徑長度爲260個字符(只有路徑,例如http://a/b/c/d,這裏的路徑是從a到d)。這 意味着如果你有長路徑包含261個字符,那麼你 將得到錯誤的請求異常。這是由於NTFS文件路徑 的限制。

另一個限制是哪些字符可以在URL路徑部分中使用。您可以使用除某些字符 之外的任何字符,因爲它們在路徑中稱爲無效字符。這些是 這些無效字符在路徑部分的一個URL,<,>,*,%,&,:,\ ,?。 要確認這一點,只需右鍵單擊您的解決方案資源管理器,然後添加 新建文件夾並將該文件命名爲以上任何一種字符,您將會收到該消息 。文件或文件夾不能爲空字符串,也不能包含「。」。或有任何下列字符.....

爲了檢查我創建了一個Web應用程序上面的情況,並把Default.aspx的A%裏面的文件夾(從 Windows資源管理器創建的),然後導航到, http://localhost:1234/A%25A/Default.aspx,我從 服務器得到的響應是錯誤的請求異常。原因是%25是% 字符,它是ASP.NET中無效的URL路徑字符。但是你可以在查詢字符串中使用這些字符。

這些限制的原因是由於安全性,例如在%幫助下,您可以對URL路徑部分 進行雙重編碼,並且:用於從服務器獲取某些特定資源。

所以我開始覺得我的問題是不可能解決的。
我敢肯定,這個問題是不存在於一些REST web服務用PHP編寫和Apache託管,所以我認爲這只是一個IIS/ASP「安全」的限制,我找不到解決方法...

最終解決方案的更新:
我找到了解決方案here:閱讀文章以瞭解所有內容。
你應該知道它可能是有風險的,所以在使用它之前要考慮好。

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