2015-06-10 66 views
2

我在進行此調用一個Web API方法:的Web API參數路徑過長

var url = rootWebApiUrl + '/api/services/files/' + $scope.selectedServer.Name + "/" + encodeURIComponent(fullPath) + '/'; 

$http.get(url) // rest of $http.get here... 

因爲fullPath變長,我上PhysicalPath財產path too long錯誤在一個框架的方法,我們有:

if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request.PhysicalPath.Length > 0) 
    return ApplicationConfigurationWeb; 

所以我想也許我可以做這樣的事情來傳遞數據,但我似乎無法得到調用擊中右的Web API方法:

var req = { 
    method: 'GET', 
    url: rootWebApiUrl + '/api/services/files', 
    params: { serverName: $scope.selectedServer.Name, path: fullPath } 
} 

$http(req) // rest of get here... 

這是一個適當的替代方法來獲取更大的數據到Web API方法嗎?如果是這樣,我的網址應該如何構建才能獲得正確的方法?如果沒有,我怎麼能通過這個path too long問題?

這是Web API方法簽名:

[Route("api/services/files/{serverName}/{path}")] 
[HttpGet] 
public IEnumerable<FileDll> Files(string serverName, string path) 
+2

如果你開始亂七八糟的URL,它幾乎總是更好地發佈在身體的數據。 – DavidG

+0

我很樂意以正確的方式做到這一點。你有一個如何去做你的建議的例子嗎?順便說一下,URL不是很大;它剛剛超過極限。 –

+0

那麼「超過極限」是相當大的:)我會挖掘一個例子... – DavidG

回答

4

與您更新的呼叫,「PARAMS」應該結束了作爲查詢字符串,因此,如果您在的WebAPI路線更新,以這樣的:

[Route("api/services/files")] 

,並將此屬性的httpRuntime節點在你的web.config的system.web部分

<httpRuntime maxQueryStringLength="32768" /> 

我相信它應該開始工作

編輯

正如DavidG提到的,更合適的方式將改爲發佈使用GET的數據。要做到這一點,你會你的要求配置改成這樣:

var req = { 
    method: 'POST', 
    url: rootWebApiUrl + '/api/services/files', 
    data: { serverName: $scope.selectedServer.Name, path: fullPath } 
} 

然後,像這樣更新您的路線:

[Route("api/services/files")] 
[HttpPost] 
public IEnumerable<FileDll> Files(FileData myData) 

哪裏的FileData將是一個類,它看起來是這樣的:

public class FileData 
{ 
    public string serverName { get; set; } 
    public string path { get; set; } 
} 
+0

這工作。如果沒有更合適的方式,比如@DavidG的回答,我會接受這個。謝謝! –

+0

我會用另一種方式編輯這個 – John

+0

好吧,你偷了我的雷霆...... – DavidG