C# 컨트롤러클래스에서 HttpContext 관련 질문드립니다.

일반 웹(관리자 페이지 등) 에서 DB 내용을 JSON 을 만들어 CURL (PHP) 로 Application/Json, POST 방식으로 보냈습니다.

받는 쪽 (콘솔서버) 에서는 EmbedIO? 라이브러리로 해당 컨트롤러 클래스를 만들고 메소드를 만들어 주소창에 입력하면 해당 메소드가 반응하게 하였습니다.

문제는 웹서버에서 전송한 JSON 데이타를 어떻게 받아야 할지 모르겠습니다.
Json 문자열로 변환하여 Deserialize 객체(배열 등)로 변환해서 콘솔서버의 DB에 등록하려고 하는 것입니다.

구글링이나 EMBEDIO 참고페이지 등에서는 Json Key에 맞춘 VO(DTO) 클래스를 만들어 객체를 get/set 하는
방법으로 하던데요.

저는 중간에 VO 클래스를 거치지 않으려고 합니다.

HttpContext.Request.Contnettype을 찍어보면 Application/Json이 제대로 찍힙니다.
그렇지만 HttpContext.Request.Body를 찍어보면 오류가 발생하더군요.

저 Body에 Json String 이 있을 것 같은데 말입니다.

1개의 좋아요

EmbedIO에서 제공하는 HttpContext.GetRequestDataAsync()을 이용하면 원하는 처리를 쉽게 할 수 있을 것 같은데요,

    [Route(HttpVerbs.Post, "/data")]
    public async Task PostJsonData() 
    {
        var data = HttpContext.GetRequestDataAsync<MyData>();
	
        // Perform an operation with the data
        await SaveData(data);
    }

JSON을 엔터티 클래스 인스턴스로 변환하면 사용하기가 쉬울 텐데 그렇게 하지 않는 이유가 있을까요?

3개의 좋아요

그 엔티티 를 말씀하시는것이 getter/settter 클래스 (DTO) 를 말하는 것이죠?
그리고 가 해당 엔티티를 할하는 건가요?

만약 EMBEDIO 를 사용안할 경우 해당 Get~<>() 를 사용할 수 없잖아요 이럴땐 Body 내용을 String Parse해서 Json 변환해야 할 거 같아서요…

1개의 좋아요

저는 정보성 클래스를 엔터티 클래스라고 표현하는데요, 엔터티 클래스가 DB쪽에서 테이블과 1대1 매핑되는 클래스로도 쓰여서… 그냥 JSON 역직렬화를 이용하기 위한 클래스 사용이 좀더 정확한 표현인 것같네요.

일단, Body는 Stream이기 때문에 변환 과정에서 오류가 발생한 것으로 보입니다.

ASP.NET Core는 메소드 매개변수 특성으로 Body에서 값을 취할 수 있어요.

[HttpPost]
[Route("api/BodyTypes/PlainStringBody")]
public string PlainStringBody([FromBody] string content)
{
    return content;
}

이런 식입니다.

그런데, EmbedIO를 안쓸 경우라 했는데 직접 TCP/IP로 받겠다는 의미인가요? ASP.NET Core를 쓰시겠다는 의미인가요?

1개의 좋아요

ExpandObject 같은것을 쓰는 형식을 이야기하는건가요?

using System.Text.Json;
using System.Dynamic;

string jsonString =
@"{
  ""Date"": ""2019-08-01T00:00:00-07:00"",
  ""TemperatureCelsius"": 25,
  ""Summary"": ""Hot"",
  ""DatesAvailable"": [
    ""2019-08-01T00:00:00-07:00"",
    ""2019-08-02T00:00:00-07:00""
  ],
  ""TemperatureRanges"": {
                ""Cold"": {
                    ""High"": 20,
      ""Low"": -10
                },
    ""Hot"": {
                    ""High"": 60,
      ""Low"": 20
    }
            },
  ""SummaryWords"": [
    ""Cool"",
    ""Windy"",
    ""Humid""
  ]
}
";
                
dynamic weatherForecast = JsonSerializer.Deserialize<ExpandoObject>(jsonString);

Console.WriteLine($"Date: {weatherForecast.Date}");
Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
Console.WriteLine($"Summary: {weatherForecast.Summary}");
1개의 좋아요

구글링 해보면

StreamRead() 메소드가 있더군요 System.IO

예제들이 다 이런방식으로 HttpContext.Reqeust.Body 혹은 HttpContext.Current.Request.InputStream
이런식으로 사용하느데 HttpContext.Request 가 해당 Body 에 대한 정의가 없다고 나옵니다.

그런데 제경우 이게 안되서요 ㅠㅠ

1개의 좋아요

맞는 거 같습니다. 문제는
HttpContext 에서 RawData 를 읽어야 하는 경우입니다.

1개의 좋아요