2014-04-20 2 views
0

WebAPI 2 프로젝트에 다음과 같은 메서드가 있습니다.Web API 2 HttpRequestMessage를 내 사용자 지정 개체에 serialize하는 방법

public class TestController : ApiController 
{ 
    [HttpPost] 
    public void Test(HttpRequestMessage request) 
    { 
     var content = request.Content; 
     string jsonContent = content.ReadAsStringAsync().Result; 
    } 
} 

내 맞춤 개체는 다음과 같습니다. 내가

<Test> 
    <Id>12345</Id> 
    <Name>My Name</Name> 
</Test> 

같은 일부 샘플 데이터를 게시 할 경우

public class Test 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

는 jsonContent의 결과 값은 올바른 것입니다. 내 질문은 내가 등

나는 방법에 HttpRequestMessage 통과해야 추가로 확인/작업을 수행 할 수 있습니다하거나

같은 것을 통과 할 수 있도록 내 개체 테스트로 HttpRequestMessage (내용)에는 직렬화해야 최선의 방법입니다
public void Test(Test oTest) 
+0

내가 묻는 바를 이해했는지 확인하기 위해 jsonContent 변수를 Test 클래스로 역 직렬화하는 방법을 알고 싶습니까? –

+0

내 질문은 매개 변수로 HttpRequestMessage 전달해야합니다 또는 Test (Test oTest) 같은 개체를 전달하는 가장 좋은 연습이 있습니다. – Tommassiov

답변

1

매개 변수는 다음과 같은 동작 방식으로 사용할 수 있습니다.

[HttpPost] 
public void Test(Test oTest) 

ASP.NET 웹 API는 Test에 요청 메시지 본문 (JSON 또는 XML)를 역 직렬화됩니다. 요청의 콘텐츠 형식 헤더를 기반으로 웹 API는 JSON과 XML 콘텐츠를 모두 처리 할 수 ​​있습니다. XML의 경우 웹 API는 기본적으로 DCS를 사용합니다. 게시물에 표시 한 XML은 그대로 직렬화되지 않습니다. Test 객체를 반환하고 웹 API에 의해 직렬화되는 방식을 확인하고 POST 요청에서 동일한 XML을 사용하여 바인딩이 올바르게 작동하는지 확인하십시오.

동작 방법에 Test 매개 변수를 사용하면 웹 API는 요청 본문 스트림을 사용합니다. 그래서, 당신은 당신이하고있는 것과 같은 행동 방법 안에서 그것을 읽을 수 없을 것입니다.

+0

Test 매개 변수를 사용하는 경우이 방법을 사용하는 것이 좋으며 HttpRequestMessage를 사용하고 HttpRequestMessage의 콘텐츠를 사용하는 것이 더 좋습니다. – Tommassiov

+0

여러 가지 방법으로이 작업을 수행 할 수 있으며 적합한 방법을 선택해야합니다. 일반적으로 사용자 정의 유형에 바인딩하면 이점이 있습니다. 예를 들어 콘텐츠 유형에 관계없이 웹 API는 요청 본문을 매개 변수에 바인딩합니다. 본문을 수동으로 읽으면 직접 수동으로 deserialize해야합니다. 대부분의 경우이 방법이 유용합니다. 또한 액션 메소드의 유닛 테스트는'HttpRequestMessage'를 사용하는 것보다 비교적 쉽습니다. – Badri

4

위에서 언급 한 첫 번째 주석과 같이 jsonContent를 Test 클래스의 새로운 인스턴스로 역 직렬화하는 방법을 묻는 것처럼 보입니다. Json.NET을 살펴볼 것을 권합니다. 그러면 다음과 같이 할 수 있습니다.

public class TestController : ApiController 
{ 
    [HttpPost] 
    public void Test(HttpRequestMessage request) 
    { 
    var content = request.Content; 
    string jsonContent = content.ReadAsStringAsync().Result; 
    Test test = new Test(); 
    test = JsonConvert.DeserializeObject<Test>(jsonContent); 
    //Do validation stuff... 
    } 
} 
관련 문제