Kubernetes-แƒ—แƒแƒœ แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ: แƒ แƒแƒ’แƒแƒ  แƒแƒ  แƒ”แƒ›แƒฎแƒ แƒแƒ‘แƒแƒ“แƒ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ”แƒกแƒžแƒแƒœแƒ”แƒšแƒ”แƒ‘แƒก

Kubernetes-แƒ—แƒแƒœ แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ: แƒ แƒแƒ’แƒแƒ  แƒแƒ  แƒ”แƒ›แƒฎแƒ แƒแƒ‘แƒแƒ“แƒ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ”แƒกแƒžแƒแƒœแƒ”แƒšแƒ”แƒ‘แƒก

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ›แƒ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒขแƒ”แƒ™แƒ˜ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜ Microsoft-แƒ˜แƒกแƒ’แƒแƒœ (Azure), แƒจแƒ”แƒ”แƒฎแƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒก: แƒชแƒแƒขแƒ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ, แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ”แƒ•แƒ แƒแƒžแƒ˜แƒ“แƒแƒœ แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒ— 400 (แƒชแƒฃแƒ“แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ). แƒงแƒ•แƒ”แƒšแƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒ .NET-แƒจแƒ˜, แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Kubernetes-แƒจแƒ˜...

แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒ แƒ˜แƒก API, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—แƒแƒช แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒ›แƒแƒ“แƒ˜แƒก แƒ›แƒ—แƒ”แƒšแƒ˜ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜. แƒแƒ› แƒขแƒ แƒแƒคแƒ˜แƒ™แƒก แƒฃแƒกแƒ›แƒ”แƒœแƒก HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ™แƒ”แƒกแƒขแƒ”แƒšแƒ˜, แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ .NET แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒแƒ“แƒจแƒ˜. แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ’แƒ•แƒ˜แƒ›แƒแƒ แƒ—แƒšแƒ แƒ˜แƒ› แƒ’แƒแƒ’แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒ˜แƒงแƒ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒแƒกแƒแƒฎแƒแƒ•แƒ“แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒก. แƒ—แƒฃแƒ›แƒชแƒ, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒแƒ แƒ—แƒฃแƒšแƒ แƒกแƒแƒ’แƒ–แƒแƒ แƒฏแƒแƒญแƒ•แƒ›แƒ:

Kubernetes-แƒ—แƒแƒœ แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ: แƒ แƒแƒ’แƒแƒ  แƒแƒ  แƒ”แƒ›แƒฎแƒ แƒแƒ‘แƒแƒ“แƒ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ”แƒกแƒžแƒแƒœแƒ”แƒšแƒ”แƒ‘แƒก

Ingress-แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒแƒ“แƒ:

{
   "number_fields":{
      "status":400,
      "request_time":0.001,
      "bytes_sent":465,
      "upstream_response_time":0,
      "upstream_retries":0,
      "bytes_received":2328
   },
   "stream":"stdout",
   "string_fields":{
      "ingress":"app",
      "protocol":"HTTP/1.1",
      "request_id":"f9ab8540407208a119463975afda90bc",
      "path":"/api/sign-in",
      "nginx_upstream_status":"400",
      "service":"app",
      "namespace":"production",
      "location":"/front",
      "scheme":"https",
      "method":"POST",
      "nginx_upstream_response_time":"0.000",
      "nginx_upstream_bytes_received":"120",
      "vhost":"api.app.example.com",
      "host":"api.app.example.com",
      "user":"",
      "address":"83.41.81.250",
      "nginx_upstream_addr":"10.240.0.110:80",
      "referrer":"https://api.app.example.com/auth/login?long_encrypted_header",
      "service_port":"http",
      "user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
      "time":"2019-03-06T18:29:16+00:00",
      "content_kind":"cache-headers-not-present",
      "request_query":""
   },
   "timestamp":"2019-03-06 18:29:16",
   "labels":{
      "app":"nginx",
      "pod-template-generation":"6",
      "controller-revision-hash":"1682636041"
   },
   "namespace":"kube-nginx-ingress",
   "nsec":6726612,
   "source":"kubernetes",
   "host":"k8s-node-55555-0",
   "pod_name":"nginx-v2hcb",
   "container_name":"nginx",
   "boolean_fields":{}
}

แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก, แƒ™แƒ”แƒกแƒขแƒ แƒ”แƒšแƒ›แƒ แƒ›แƒ˜แƒกแƒชแƒ:

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒจแƒ˜แƒช แƒ™แƒ˜, Kestrel-แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒฃแƒ™แƒ˜แƒ“แƒฃแƒ แƒ”แƒกแƒแƒ“ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ แƒชแƒแƒขแƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ:

{
   "number_fields":{"ThreadId":76},
   "stream":"stdout",
   "string_fields":{
      "EventId":"{"Id"=>17, "Name"=>"ConnectionBadRequest"}",
      "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
      "ConnectionId":"0HLL2VJSST5KV",
      "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
      "@t":"2019-03-07T13:06:48.1449083Z",
      "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
      "message":"Malformed request: invalid headers."
   },
   "timestamp":"2019-03-07 13:06:48",
   "labels":{
      "pod-template-hash":"2368795483",
      "service":"app"
   },
   "namespace":"production",
   "nsec":145341848,
   "source":"kubernetes",
   "host":"k8s-node-55555-1",
   "pod_name":"app-67bdcf98d7-mhktx",
   "container_name":"app",
   "boolean_fields":{}
}

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒ›แƒฎแƒแƒšแƒแƒ“ tcpdump แƒ“แƒแƒ’แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒ— แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒแƒจแƒ˜ ... แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒ’แƒแƒ•แƒ˜แƒ›แƒ”แƒแƒ แƒ”แƒ‘ แƒกแƒแƒขแƒ แƒแƒœแƒกแƒžแƒแƒ แƒขแƒ แƒฏแƒแƒญแƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘:

Kubernetes-แƒ—แƒแƒœ แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ: แƒ แƒแƒ’แƒแƒ  แƒแƒ  แƒ”แƒ›แƒฎแƒ แƒแƒ‘แƒแƒ“แƒ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ”แƒกแƒžแƒแƒœแƒ”แƒšแƒ”แƒ‘แƒก

แƒ’แƒแƒ›แƒแƒซแƒ˜แƒ”แƒ‘แƒ

แƒชแƒฎแƒแƒ“แƒ˜แƒ, แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ›แƒแƒฃแƒกแƒ›แƒ˜แƒœแƒแƒ— แƒขแƒ แƒแƒคแƒ˜แƒ™แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒ™แƒ•แƒแƒœแƒซแƒ–แƒ”, แƒกแƒแƒ“แƒแƒช Kubernetes-แƒ›แƒ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ pod: แƒœแƒแƒ’แƒแƒ•แƒกแƒแƒงแƒ แƒ”แƒšแƒ˜แƒก แƒ›แƒแƒชแƒฃแƒšแƒแƒ‘แƒ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒฃแƒš แƒ›แƒชแƒ˜แƒ แƒ” แƒ แƒแƒฆแƒแƒชแƒ˜แƒก แƒžแƒแƒ•แƒœแƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒกแƒฌแƒ แƒแƒคแƒแƒ“. แƒ“แƒ แƒ›แƒแƒ แƒ—แƒšแƒแƒช, แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒฉแƒแƒ แƒฉแƒ แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒ:

GET /back/user HTTP/1.1
Host: api.app.example.com
X-Request-ID: 27ceb14972da8c21a8f92904b3eff1e5
X-Real-IP: 83.41.81.250
X-Forwarded-For: 83.41.81.250
X-Forwarded-Host: api.app.example.com
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Original-URI: /front/back/user
X-Scheme: https
X-Original-Forwarded-For: 83.41.81.250
X-Nginx-Geo-Client-Country: Spain
X-Nginx-Geo-Client-City: M.laga
Accept-Encoding: gzip
CF-IPCountry: ES
CF-RAY: 4b345cfd1c4ac691-MAD
CF-Visitor: {"scheme":"https"}
pragma: no-cache
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
referer: https://app.example.com/auth/login
accept-language: en-US,en;q=0.9,en-GB;q=0.8,pl;q=0.7
cookie: many_encrypted_cookies; .AspNetCore.Identity.Application=something_encrypted; 
CF-Connecting-IP: 83.41.81.250
True-Client-IP: 83.41.81.250
CDN-Loop: cloudflare

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

แƒœแƒแƒ’แƒแƒ•แƒกแƒแƒงแƒ แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒ—แƒ•แƒแƒšแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒกแƒ˜แƒขแƒงแƒ•แƒ แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒ M.laga. แƒแƒ“แƒ•แƒ˜แƒšแƒ˜ แƒ›แƒ˜แƒกแƒแƒฎแƒ•แƒ”แƒ“แƒ แƒ˜แƒ, แƒ แƒแƒ› แƒ”แƒกแƒžแƒแƒœแƒ”แƒ—แƒจแƒ˜ แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก M.laga แƒฅแƒแƒšแƒแƒฅแƒ˜ (แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒ˜แƒก Malaga). แƒแƒ› แƒ˜แƒ“แƒ”แƒ˜แƒก แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒ”แƒ— Ingress-แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก, แƒกแƒแƒ“แƒแƒช แƒ•แƒœแƒแƒฎแƒ”แƒ— แƒ”แƒ แƒ—แƒ˜ แƒ—แƒ•แƒ˜แƒก แƒฌแƒ˜แƒœ แƒฉแƒแƒกแƒ›แƒฃแƒšแƒ˜ (แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ—) "แƒฃแƒฌแƒงแƒ˜แƒœแƒแƒ แƒ˜" แƒœแƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜:

    ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Nginx-Geo-Client-Country $geoip_country_name;
      proxy_set_header X-Nginx-Geo-Client-City $geoip_city;

แƒแƒ› แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ’แƒแƒฎแƒ“แƒ! (แƒ›แƒแƒšแƒ” แƒ’แƒแƒ˜แƒ แƒ™แƒ•แƒ, แƒ แƒแƒ› แƒ—แƒแƒ•แƒแƒ“ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒแƒฆแƒแƒ  แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ“แƒ แƒ”แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜.)

แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒก แƒฃแƒคแƒ แƒ แƒ–แƒแƒ’แƒแƒ“แƒแƒ“. แƒ›แƒ˜แƒกแƒ˜ แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ แƒ”แƒžแƒ แƒแƒ“แƒฃแƒชแƒ˜แƒ แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒขแƒ”แƒšแƒœแƒ”แƒขแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ— localhost:80:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Desiree

... แƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ‘แƒ 401 Unauthorized, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒ. แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ—:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Dรฉsirรฉe

?

แฒ“แƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ‘แƒ 400 Bad request โ€” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒจแƒ˜ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒฃแƒ™แƒ•แƒ” แƒœแƒแƒชแƒœแƒแƒ‘ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒแƒก:

{
   "@t":"2019-03-31T12:59:54.3746446Z",
   "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
   "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
   "ConnectionId":"0HLLLR1J974L9",
   "message":"Malformed request: invalid headers.",
   "EventId":{
      "Id":17,
      "Name":"ConnectionBadRequest"
   },
   "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
   "ThreadId":71
}

แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜

แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ แƒ™แƒ”แƒกแƒขแƒ แƒ”แƒšแƒ˜ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ“แƒแƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ— HTTP แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜ UTF-8-แƒ˜แƒก แƒกแƒฌแƒแƒ แƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒฅแƒแƒšแƒแƒฅแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒก.

แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒคแƒแƒฅแƒขแƒแƒ แƒ˜แƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒแƒ  แƒ’แƒ”แƒ’แƒ›แƒแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ Kestrel-แƒ˜แƒก แƒ˜แƒ›แƒžแƒšแƒ”แƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒก. แƒ—แƒฃแƒ›แƒชแƒ, แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ—แƒแƒ•แƒแƒ“ AspNetCore-แƒจแƒ˜ (โ„– 4318, โ„– 7707) แƒแƒ›แƒ‘แƒแƒ‘แƒ”แƒœ, แƒ แƒแƒ› แƒ”แƒก แƒแƒ  แƒฃแƒจแƒ•แƒ”แƒšแƒ˜แƒก...

แƒจแƒ”แƒฏแƒแƒ›แƒ”แƒ‘แƒ: แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ แƒแƒฆแƒแƒ  แƒแƒ แƒ˜แƒก Kestrel-แƒ˜แƒก แƒแƒœ UTF-8-แƒ˜แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ–แƒ” (2019 แƒฌแƒ”แƒšแƒก?!), แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ˜แƒ›แƒแƒ–แƒ”, แƒ แƒแƒ› แƒ’แƒแƒœแƒ”แƒ‘แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒแƒ‘แƒ แƒ“แƒ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ’แƒแƒ“แƒแƒ“แƒ’แƒแƒ›แƒ— แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒแƒ“แƒ แƒ” แƒ—แƒฃ แƒ’แƒ•แƒ˜แƒแƒœ แƒ’แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ‘แƒก แƒœแƒแƒงแƒแƒคแƒก. แฒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ”แƒ‘แƒ˜!

PS

แƒแƒกแƒ”แƒ•แƒ” แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒšแƒแƒ’แƒ–แƒ”:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ