2013-05-10 2 views
5

RestSharp를 사용하여 콘솔을 통해 액세스하려는 웹 API 서비스가 있습니다. 내 RestSharp 코드는 다음과 같습니다.RestSharp를 사용한 웹 API 호출 - 동작시 null 매개 변수를 일으키는 body에 application/json이 추가됩니다.

  RestClient client = new RestClient(baseUrlString); 
     RestRequest request = new RestRequest("controllername/actionname"); 
     request.RequestFormat = DataFormat.Json; 

     ProcessQuestion model = new ProcessQuestion() 
     { 
      Id = "123456", 
      InstanceId = "123", 
      UniqueId = "bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626", 
      PostedAnswer = new Dictionary<string, string>() { { "question_7907_1", "selected" }, { "question_7907_2", "selected" } } 
     }; 
     request.AddBody(model); 

     var response = client.Execute(request) 

내 웹 API 작업은 위 모델과 동일한 매개 변수를 가진 모델을 사용합니다. 호출이 실행되면 바인딩은 실패하고 매개 변수는 null입니다.

{application/json={"Id":"123456","InstanceId":"123","UniqueId":"bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626","PostedAnswer":{"question_7907_1":"selected","question_7907_2":"selected"}}} 

것은 내가 몸이 제대로 모델에 결합 피들러를 사용하여 게시 할 경우 아래 그림과 같이 나는이 몸 값으로 RestRequest.AddBody 방법 붙이는 응용 프로그램/JSON 때문입니다 생각한다. 피들러의 몸 값이 응용 프로그램/JSON 키를 붙이는을 제외하고 동일하다는 것을

{'Id':'123456','InstanceId':'123','Uniqueid':'bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626','PostedAnswer':{'question_7907_1':'selected','question_7907_2':'selected'}} 

참고 : 아래는 내가 피들러에서 제공되는 몸 값입니다.

참고 사항 : 나는 모든 것으로 보이는 것을 시도했습니다 ... FromBody 및 FromUri 특성을 사용하는 매개 변수를 분리했습니다. 사용자 지정 DictionaryModelBinder를 시도하고 사용자 지정 ValueBinders를 시도했으며, RestSharp (AddParameter와 RequestBody 매개 변수, AddObject, 다른 URL 스타일 등)를 사용합니다.

다른 누구에게도이 문제가 발생 했습니까? 그렇다면 해결 했습니까? 모델 바인딩이 MVC에서와 같이 작동 할 것이라는 희망으로이 서비스에 대한 Web API를 선택했지만 실제로 그렇지 않습니다.

감사

편집 (해결) : RestSharp 자동으로 AddBody 방법에 전달 된 개체의 JsonSerializer를 사용합니다. 나는 무언가 간단한 것을 놓친 것 같았고 실제로 저는 ... RestRequest 인스턴스에 Method.Post 매개 변수를 추가하면 문제가 해결되었습니다.

답변

6
  1. 요청을 만들 때 방법을 지정 :

    RestRequest request = new RestRequest("controllername/actionname", Method.POST);

  2. 되지 않음 기본 시리얼 몸을 위해 무엇인지는 - 당신이 명시 적으로 만드는 시도 할 수 있습니다 :

    request.AddBody(request.JsonSerializer.Serialize(model));

  3. 'application/json'이 어디에서 왔는지 확실하지 않습니다. nt-type 헤더는 귀하의 요청과 함께 보내야하며, 분명히 신체의 일부가 아닙니다. 그래서 그 대신 이렇게 :

    request.AddHeader("Content-type", "application/json; charset=utf-8");

  4. 문제가 해결되지 않으면 가능한 한 자신의 사이트에있는 예제 코드를 유사한 시도해보십시오. 복잡성을 제거해보십시오 (필요한 기능을 변경하는 것을 의미한다고하더라도). 작동하는 시점까지 가져 와서 추가 기능을 구축하십시오.

http://restsharp.org/

+0

RestSharp 자동 AddBody 방법 전달 개체의 JsonSerializer을 이용한다. 나는 무언가 간단한 것을 놓친 것 같았고 실제로 저는 ... RestRequest 인스턴스에 Method.Post 매개 변수를 추가하면 문제가 해결되었습니다. 감사. –