Nancy: ๋งŽ์€ ๋™์‹œ ์š”์ฒญ

์— ๋งŒ๋“  2016๋…„ 04์›” 16์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NancyFx/Nancy

์„ค๋ช…

Nancy๋Š” ๋งŽ์€(<10) ๋™์‹œ ์š”์ฒญ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฒˆ์‹ ๋‹จ๊ณ„

  1. ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋ ค๋ฉด StaticContentsConventions๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  2. ๊ธด ๋น„๋””์˜ค ํŒŒ์ผ์„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์˜ˆ๋ฅผ ๋“ค์–ด http://localhost/myvideo.mp4๋ฅผ ๋ชจ๋‘ ๊ฐ€๋ฆฌ์ผœ ๋งŽ์€ ํƒญ(>10)์—์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋น„๋””์˜ค๋ฅผ ์—ฝ๋‹ˆ๋‹ค
  4. ๊ด€์ฐฐ: ๋น„๋””์˜ค๋Š” ๋ชจ๋“  ํƒญ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  ๋‹ค๋ฅธ ํƒญ์„ ๋‹ซ์„ ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    ์‹œ์Šคํ…œ ์„ค์ •

  • ๋‚ธ์‹œ ๋ฒ„์ „: 1.4.1
  • ๋‚ธ์‹œ ํ˜ธ์ŠคํŠธ: OWIN
  • ๋ธŒ๋ผ์šฐ์ €: ํฌ๋กฌ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ •์  ์ฝ˜ํ…์ธ (๋˜๋Š” ๋‹ค๋ฅธ http ์„œ๋ฒ„)์— nginx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  9 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ Windows OS์—์„œ ์ „์ฒด iis์™€ ๊ด€๋ จ๋œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋น„๋ช…์„ ์ง€๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์˜ Windows/iis๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ(์žˆ๋Š” ๊ฒฝ์šฐ)?

์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Microsoft.Owin.Host.HttpListener์™€ ํ•จ๊ป˜ Selfhosting์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ์•„๋‹๊นŒ์š”?
OS๋Š” ์œˆ๋„์šฐ 10์ž…๋‹ˆ๋‹ค.
์…€ํ”„ํ˜ธ์ŠคํŒ…์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ •์  ์ฝ˜ํ…์ธ (๋˜๋Š” ๋‹ค๋ฅธ http ์„œ๋ฒ„)์— nginx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

@Kiri-rin nginx๊ฐ€ ์ •์  ์ฝ˜ํ…์ธ ์— ์™„๋ฒฝํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๊ณ  nancy๊ฐ€ API ๊ด€๋ จ ํ•ญ๋ชฉ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋น„์ •์  ์ฝ˜ํ…์ธ ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์„ ๋” ์กฐ์‚ฌํ•  ๊ฒƒ์ด๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜์žˆ๋Š” ํžŒํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@cody82 ๊ฒฝ๋กœ๊ฐ€ ์˜ค๋ž˜ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์š”์ฒญ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋„๋ก ๋น„

์˜ˆ. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ๋‚ธ์‹œ์˜ ์ผ๋ฐ˜์ ์ธ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋น„๋™๊ธฐ๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ •์  ํŒŒ์ผ ํ•ธ๋“ค๋Ÿฌ์— ์žˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”?

๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ๋™๊ธฐ์‹ Socket.Write ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ServiceStack์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

GenericFileResponse.GetFileContent์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

c# private static Action<Stream> GetFileContent(string filePath, long length) { return stream => { using (var file = File.OpenRead(filePath)) { file.CopyTo(stream, (int)(length < BufferSize ? length : BufferSize)); } }; }

๋”ฐ๋ผ์„œ File.CopyTo๋Š” ํŒŒ์ผ/๋น„๋””์˜ค๊ฐ€ ์ „์†ก๋˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
(๋˜ํ•œ ์ด ํด๋ž˜์Šค๋Š” ๋ถ€๋ถ„ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์Œ๋งค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)
์ด๊ฒƒ์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ๋˜์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

(๋˜ํ•œ ์ด ํด๋ž˜์Šค๋Š” ๋ถ€๋ถ„ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์Œ๋งค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)

@cody82 ๋น„๋””์˜ค/์˜ค๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ PartialFileResponse๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/danbarua/0fd9fcad5ec85e0c02dc

์•ฝ๊ฐ„์˜ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ Nancy์— ๋ณ‘ํ•ฉ๋˜๊ฑฐ๋‚˜ GenericFileResponse์— ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰