본문 바로가기

C#/근웹 연대기

(29)
c#으로 근본 없는 웹서버 개발기 13 : json stringify 만들기 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 서버가 브라우저와 비동기 통신을 할 때, 주로 JSON형태의 데이터를 주고받는다. c#에서 이러한 것을 다룰 때는, 편리한 도구 같은 것이 내부 라이브러리에는 없는지라, 외부 패키지인 Newtonsoft社의 Json.net을 사용한다. 그런데 지금까지 연대기에서는 외부 패키지를 사용하지 않았다. 그렇다 외부 패키지를 쓸 거였으면 지금까지 한 땀 한 땀 코딩했던 것들이 의미가 없는 것이 된다. 그렇다 이미 완전한 물건을 쓴다면 그 물건에 대한 애착은 그다지 끈끈하지 않을 것이다. 그렇다 부족하니까 채워주고 싶은 욕구다. 우선 전체적인 계획 없이 다음과 같이 근본이 되는 클래스를 작성하였다. public abstract c..
c#으로 근본 없는 웹서버 개발기 12 : Redirect ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 웹서버에서 어떤 특정한 조건에서, 다른 URL로 유도하는 것이 redirect라고 한다. 여담으로, 나는 처음 이것을 공부할 때, 어떤 이유로 Redirect를 하면 리퀘스트 값이 없어지는지 혼란스러웠다. 리퀘스트 값을 계속 유지하면 그것을 재활용하여 코드를 더 간결하게 작성할 수 있을 것 같았기 때문이다. 그렇다 그때는 동작원리를 잘 몰랐기 때문이다. (정말 간단한 것을...) ... 그때를 회상하며 응답 헤더가 되는 부분을 다음과 같이 작성하였다. static void reDirect(Socket client, string url) { var sb = new StringBuilder(100); sb.AddL("HTT..
c#으로 근본 없는 웹서버 개발기 11 : 세션마다 닉네임 부여 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 기존에 세션 값은 위 사진처럼 헥사 값으로 되어있어서 사람 눈으로는 분간하기가 힘들다. 그래서 나중에 Debug 할 때, 분간하기 쉽도록 닉네임을 주기로 하였다. 무엇으로 할지 고민하다가 그냥 무난한 동물 이름으로 하기로 하고 구글에 검색했더니 적당한 사이트가 나왔다. http://animal.memozee.com/animal/Dic/ 이 사이트의 좋은 점은 디자인이 좀 후 달려 보이나, 복사 붙여 넣기를 하면 동물명만 카피되고 다른정보는 안 나와서 추가로 파싱 작업을 할 필요가 없다는 것이다. 마치.. 그것을 의식하고 만들었을까 하는 생각마저 들게 하는 심플함이다. 파일 이름은 우선순위를 낮추기 위해서 Z를 박아주었다..
c#으로 근본 없는 웹서버 개발기 10 : GET, POST 파라미터 받기 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 소스가 커질수록 점점... 머리가 복잡해진다. 시간이 지나면 나조차도 모르게 되어버릴 거 같다. 그러나 계속 나아가야 한다. 멈추지 말고 나아가야 한다. 한번 멈추면 또 멈추게 되고, 흐지부지 되고, 결국 안한것만도 못하는 시간이 된다. 항상 그랬다. 어떤 일이든 깔짝 만지다가 손을 빼면, 마음과는 다르게 그것을 다시 볼일이 없을 거라는 듯이 점점 잊어버린다. 그렇다 중도에 다시 시작을 하려해도 이어서 하기가 안된다. 그러니 나아가야 한다. 웹에서 기본이 되는 GET과 POST방식의 파라미터를 받아오기 위하여 다음과 같이 html 파일을 작성하였다. GET 전송 POST 전송 하기와 같이 화면이 나온다. POST man..
c#으로 근본 없는 웹서버 개발기 9 : 소켓연결버그 원인 및 해결 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 원인 분석 전편의 버그를 잡아내기 위해 진입점에 디버그 포인트를 걸고, 버그가 발생되는 상황을 재연하기 위해 크롬과 웨일 브라우저를 각각 켜서 localhost에 접속하고 멈추는 구간을 찾기로 하였다. 먼저 크롬에서 메인 루프를 한 바퀴 돌아주고 웨일 브라우저에서 새로고침을 하니, 다음과 같이 디버그 포인트에 들어서질 않았다. 그렇다 원인은 처음에 접속할 때 생기는 게 확실하다. 그래서 다시 처음 과정으로 돌아와, 스텝 by 스텝으로 스레드가 멈추는 구간을 한 단계 한 단계 진행을 시켜보니 문제없이 while문이 한 바퀴를 완료하고 있었다. 그렇다 이러한 버그는 디버그 스텝을 밟으면 그냥 실행하는 것과는 다르게 시간차가..
c#으로 근본 없는 웹서버 개발기 8 : sessionID & 소켓연결버그 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 한번 접속하고 두 번 접속한다면, 그 녀석이 그놈이었는지 대한 정보가 필요하기 마련이다. http통신은 항상 필요할 때만 접속을 하기 때문에 브라우저는 내가 그놈이었다는 정보가 필요하기 마련이다. 그래서 쿠키값으로 일정한 값을 가지고 있으면서 내가 그놈이 이었다고 접속할 때마다 식별을 당하기를 원한다. 이것이 쉽게 노출될 때, 저 값을 복사될 때, 로그인을 빼앗기는 현상이 발생할 수 있으므로 공용 컴퓨타를 사용할 경우는 꼭 로그아웃을 하고, 그것도 불안하면 웹브라우저를 완전히 닫고 또 그것도 불안하면 브라우저 설정에서 쿠키 캐시를 일괄 삭제하여야 한다. 그리고 https를 사용하지 않는 사이트는, 되도록이면 로그인 같은..
c#으로 근본 없는 웹서버 개발기 7 : 304 Not ModiFied 구현 ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 하기로 했던 것은 언제나 마음속 어딘가에 남아있기 마련이다. 전전편에서 언급하였던 Etag를 활용한 304를 써먹을 수 있도록 코드를 작성하였다. public class Ftag { public FileInfo info = null; public string etag = null; public string modiTime = null; public string minetype = null; } ↕는 동일한 파일에 위치한다. static readonly Dictionary fileDic = new Dictionary(); public static Ftag getFInfo(string fulPath) { var info =..
c#으로 근본 없는 웹서버 개발기 6 : minetype ⚠WARNING ASP.NET에 대한 포스팅이 아닙니다 나가실 문은 오른쪽 하단입니다 HTTP를 이용하여 파일을 전송하고자 할 땐 content-type이라는 것을 명명하여 각각 파일 확장자에 맞는 minetype을 표기를 하여 보내줘야 한다. 예를 들어 text를 보냈는데, minetype이 image일 경우는 브라우저 창에는 아무것도 표기되지 않는다. 어차피 파일마다 확장자가 있기에 무슨 필요가 있느냐고 질문을 할지 모르겠지만, 파일에 확장자를 쓰지 않는 경우도 있다. 그런 경우는 minetype에 전적으로 의지 할 수밖에 없다. 다음 내용은 모질라 사이트에서 minetype으로 검색한 내용을 긁어와 csv파일 형태로 정리한 형태다. .aac,AAC 오디오 파일,audio/aac .abw,AbiWor..