2014-10-30 104 views
1

我使用ASP .NET Web API創建了一個Web服務。其方法是:無法將日期時間參數傳遞給Web服務,GET

[HttpGet] 
    [Route("service/{applicantUser}/{lastUpdate:datetime?}")] 
    public IHttpActionResult getService(String applicantUser, DateTime? lastUpdate = null){ 
    // some stuff here 

} 

如果我把這樣的WS:

http://myserver/api/service/myusername/2008-12-10 

一切工作不錯,我獲得正確的JSON文件。但是,如果我嘗試添加時間:

http://myserver/api/service/myusername/2008-12-10T12:30:00 

我得到錯誤404 - Bad Request

+0

這是否網址工作:'HTTP:// MYSERVER/API /服務/名爲myUsername /? lastUpdate = 2008-12-10T12:30:00' – DavidG 2014-10-30 17:31:38

+0

哦,是的,它的工作原理。但是,有沒有辦法避免RPC風格? – GVillani82 2014-10-30 17:34:26

回答

2

問題出在不允許的URL中的冒號(:)字符。您可以把參數的查詢字符串:

http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00 

或禁用驗證檢查潛在的危險請求路徑通過合併這對你的web.config

<system.web> 
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" /> 
    <pages validateRequest="false" /> 
</system.web> 
+0

好的,謝謝!你認爲這是非常危險的禁用驗證? – GVillani82 2014-10-30 17:39:13

+0

嗯,我想這是有很好的理由。但是,更好地編寫自己的想法並閱讀文檔http://msdn.microsoft.com/en-us/library/hh882339(v=vs。110)的.aspx – DavidG 2014-10-30 18:31:41

0

不幸的是,冒號(:)字符導致你的壞請求錯誤,因爲它是URL模式內的活躍人物。

您必須找到反序列化或將其接受爲不帶冒號字符的參數的方法,或者您也可以嘗試從錨點(#)解析日期,因爲URL可以用冒號安全地解析在一個錨點內。例如:http://myserver/api/service/myusername#2008-12-10T12:30:00

+0

這個*應該*可以使用Route來解析(「service/{applicantUser}#{lastUpdate:datetime?}」)' – 2014-10-30 17:27:26

+0

真的嗎?很確定'#'之後的任何東西都不會傳遞給服務器。 – DavidG 2014-10-30 17:27:32

+0

我嘗試過使用#,但它仍然不起作用 – GVillani82 2014-10-30 17:30:27

0

正如我的前任已經正確地提到,「:」字符會導致錯誤。

避免這種情況的一種方法是使用URL編碼的參數。因此,當您嘗試手動設置lastUpdate參數時: 使用「%3A」而不是「:」(冒號),冒號字符的URL編碼表示形式。

如果您正在構建從應用程序中的路線: HttpUtility.UrlEncode() 是你的朋友。

0

如果您不想禁用安全設置,則可以將DateTime作爲字符串發送,而不存在潛在危險的符號。發送的字符串是這樣的:

String date = DateTime.Now.ToString("MM-dd-yyyyTHH-mm-s"); 

,然後用你的特殊模式解析它在控制器端:

if (DateTime.TryParseExact(dateToParse, "MM-dd-yyyyTHH-mm-s", new CultureInfo("en-US"), DateTimeStyles.None, out DateTime date)) { 
// your code here 
} 
相關問題