2014-08-31 6 views
1

결과를 필터링 할 수있는 복잡한 개체 목록을 GET 요청에 전달해야합니다.ASP 웹 API 2의 복잡한 매개 변수 GET

복잡한 객체는 다음과 같습니다

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements={"Name":"test", "Value":"x", "IgnoreCase": true} 
:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements=%7B%22Name%22%3A%22test%22%2C%20%22Value%22%3A%22x%22%2C%20%22IgnoreCase%22%3A%20true%7D 

이 같은의를 디코딩 :

public class RecordFilter 
{ 
    public int PageNumber {get;set;} 
    public int MaxRecordsPerPage {get;set;} 
    public List<FilterElement> FilterElements {get;set;} 
} 

public FilterElement 
{ 
    public string Name {get;set;} 
    public object Value {get;set;} 
    public bool IgnoreCase {get;set;} 
} 

지금 나는이 같은 GET-요청에서 매개 변수로이를 전달하려는

"FilterElements"-List에는 요소가 추가되지만이 요소에는 생성자 (저는 [FromURI]를 사용하고 있습니다) ...

내 객체 목록을 Webservice에 전달하려면 어떻게해야합니까?

답변

0

GET 매개 변수에 JSON 객체를 배치하면 GET 메소드를 잘못 사용하게됩니다. w3c에 따르면 GET 메서드는 웹 서비스에서 데이터를 검색하는 데에만 사용해야합니다. (See w3schools.com)

이 문제가 스타일에 영향을 줄 수 있지만 URL 매개 변수에 "payload"를 넣지 않은 또 다른 실질적인 이유가 있습니다. URL에 길이 제한이 있습니다. 전달할 목록의 크기가 다를 수 있으며 JSON 직렬화 된 목록이 항상 URL의 최대 길이보다 짧으면 확실하지 않습니다 (roughly 2000 characters by the way)

내 제안은 GET 을 빌드하는 것입니다. 웹 서비스에서 POST 메소드. 당신은 너무처럼 클라이언트에서 POST 메서드를 호출하여 서비스에 FilterElement의 목록을 전달합니다 (here를 참조)

using (var wb = new WebClient()) 
{   
    string url = "api/test/records"; //the URL to your web service 
    var response = wb.UploadValues(url, "POST", FilterElements); //FilterElements being a list of objects you want to pass 
} 

는 그런 다음 웹 서비스 세션의 목록을 저장합니다. (이 예제에서는 기본 유형이 사용되지만 세션은 복합 유형에 대해서도 작동합니다).

GET 메서드에서 read the list from the session 사용자 지정 필터링을 수행하고 필터링 된 목록을 반환하십시오.

+0

이 솔루션은 훌륭하고 정확하게 내가 찾고있는 솔루션입니다! –

+0

세션에 대한 마지막 질문이 하나 있습니다. 나는 다음과 같은 세션을 사용했다 : _session = SessionStateUtility.GetHttpSessionStateFromContext (HttpContext.Current); 하지만 세션에 몇 가지 값을 입력하면 다음 번 webservice 호출을 한 후에 더 이상 값이 없습니다. 이 코드를 global.aspx에 저장합니다. void Application_PostAuthorizeRequest() {HttpContext.Current.SetSessionStateBehavior (System.Web.SessionState.SessionStateBehavior.Required);} –

+0

'using System.Web'을 사용하여 생성합니다. 그런 다음 'HttpContext.Current.Session [ "FilterElementSorageKey"] = myFilterElementList'를 사용하여 데이터를 POST 메서드에 저장합니다. 데이터를 읽으려면 'List 를 사용하십시오. myFilterElementsList = HttpContext.Current.Session [ "FilterElementSorageKey"]' –