閱讀142 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ASP.NET Core?????????????????????3???????????????????????????HTTP????????????-??????-????????????-?????????

????????????ASP.NET Core????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HTTP????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HTTP?????????

??????
??????HttpApplication
?????? FeatureCollection
?????? HostingApplication
??????HttpContext
?????? DefaultHttpContext
?????? HostingApplication
?????? ??????
???????????????
?????? HttpListenerServer
?????? ServerFactory
?????? ??????

clip_image002

ASP.NET Core???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpApplication???????????????????????????????????????Server???HttpApplication?????????????????????5????????????Server??????????????????HTTP???????????????HttpApplication???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpApplication?????????????????????????????????????????????

?????????????????????????????????IHttpApplication<TContext>????????????????????????HttpApplication???????????????TContext?????????????????????????????????????????????HttpApplication??????????????????Server???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

   1: public interface IHttpApplication<TContext>
   2: {
   3:     TContext CreateContext(IFeatureCollection contextFeatures); 
   4:     Task ProcessRequestAsync(TContext context);
   5:     void DisposeContext(TContext context, Exception exception);
   6: }

????????????????????????CreateContext???????????????????????????IFeatureCollection??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Vaue???????????????????????????Key??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Get??????????????????????????????????????????????????????????????????????????????Set??????????????????FeatureCollection??????????????????????????????????????????????????????

   1: public interface IFeatureCollection
   2: {
   3:     TFeature Get<TFeature>();
   4:     void Set<TFeature>(TFeature instance);
   5: }
   6:?? 
   7: public class FeatureCollection : IFeatureCollection
   8: {
   9:     private ConcurrentDictionary<Type, object> features = new ConcurrentDictionary<Type, object>();
  10:?? 
  11:     public TFeature Get<TFeature>()
  12:     {
  13:         object feature;
  14:         return features.TryGetValue(typeof(TFeature), out feature) 
  15:             ? (TFeature)feature 
  16:             : default(TFeature);
  17:     }
  18:?? 
  19:     public void Set<TFeature>(TFeature instance)
  20:     {
  21:         features[typeof(TFeature)] = instance;
  22:     }
  23: }

?????????????????????HttpApplication?????????????????? HostingApplication????????????????????????????????????????????????????????????????????????IHttpApplication<Context>???????????????Context??????????????????????????????????????????????????????Context????????????HttpContext???????????????????????????????????????HTTP????????????????????????????????????Context?????????Scope???StartTimestamp????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Logger???BeginScope??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

   1: public class HostingApplication : IHttpApplication<Context>
   2: {
   3:     //??????????????????
   4: }
   5:?? 
   6: public class Context
   7: {
   8:     public HttpContext     HttpContext { get; set; }
   9:     public IDisposable     Scope { get; set; }
  10:     public long            StartTimestamp { get; set; }
  11: }

6???????????????UML????????????HttpApplication?????????????????????/?????????????????????????????????????????????????????????IHttpApplication<TContext>??????HttpApplication????????????????????????????????????HttpApplication????????????????????????????????????????????????????????????????????????????????????????????????????????????HTTP??????????????????????????????????????????????????????????????????IFeatureCollection????????????FeatureCollection?????????????????????????????????ASP.NET Core ???????????????HttpApplication?????????HostingApplication???????????????????????????????????????Context?????????Context??????????????????HttpContext???????????????????????????????????????????????????

??????????????????HTTP?????????????????????HttpContext??????ASP .NET Core??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpContext?????????????????????????????????????????????HTTP????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Requst???Response?????????

   1: public abstract class HttpContext
   2: {
   3:     public abstract HttpRequest     Request { get; }
   4:     public abstract HttpResponse    Response { get; }
   5: }

????????????????????????HttpRequest???HttpResponse?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpRequest????????????????????????????????????Url???????????????HttpResponse??????????????????????????????????????????????????????OutputStream?????????????????????ContentType????????????????????????StatusCode??????

   1: public abstract class HttpRequest
   2: {
   3:     public abstract Uri Url { get; }
   4: }
   5:?? 
   6: public abstract class HttpResponse
   7: {
   8:     public abstract Stream     OutputStream { get; }
   9:     public abstract string     ContentType { get; set; }
  10:     public abstract int        StatusCode { get; set; }
  11:?? 
  12:     public void WriteFile(string fileName, string contentType)
  13:     {
  14:         if (File.Exists(fileName))
  15:         {
  16:             byte[] content         = File.ReadAllBytes(fileName);
  17:             this.ContentType       = contentType;
  18:             this.OutputStream.Write(content, 0, content.Length);
  19:         }
  20:         this.StatusCode = 404;
  21:     }
  22: }

ASP.NET Core???????????????HttpContext??????????????????DefaultHttpContext??????????????????DefaultContext??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????DefaultHttpContext?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????FeatureCollection?????????????????????

clip_image006

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????FeatureCollection?????????????????????????????????DefaultHttpContext??????????????????????????????????????????DefaultHttpContext???????????????????????????????????????????????????????????????????????????????????????????????????????????????

????????????DefaultHttpContext?????????????????????HTTP????????????????????????DefaultHttpContext???????????????????????????????????????????????????????????????DefaultHttpContext????????????IFeatureCollection???????????????HttpContextFeatures????????????????????????????????????????????????????????????HTTP????????????????????????FeatureCollection????????????????????????????????????????????????????????????DefaultHttpContext??????????????????????????????????????????????????????DefaultHttpRequst???HttpResponse?????????

   1: public class DefaultHttpContext : HttpContext
   2: { 
   3:    public IFeatureCollection HttpContextFeatures { get;}
   4:?? 
   5:     public DefaultHttpContext(IFeatureCollection httpContextFeatures)
   6:     {
   7:         this.HttpContextFeatures = httpContextFeatures;
   8:         this.Request             = new DefaultHttpRequest(this);
   9:         this.Response            = new DefaultHttpResponse(this);
  10:     }   
  11:     public override HttpRequest     Request { get; }
  12:     public override HttpResponse    Response { get; }
  13: }

??????????????????HTTP?????????????????????????????????DefaultHttpContext??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????IHttpRequestFeature???IHttpResponseFeature????????????HttpRequest???HttpResponse??????????????????????????????

   1: public interface IHttpRequestFeature
   2: {
   3:     Uri Url { get; }
   4: }
   5:?? 
   6: public interface IHttpResponseFeature
   7: {
   8:     Stream     OutputStream { get; }
   9:     string     ContentType { get; set; }
  10:     int        StatusCode { get; set; }
  11: }

?????????DefaultHttpContext?????????????????????????????????DefaultHttpRequest???DefaultHttpResponse????????????????????????????????????FeatureCollection????????????HttpRequestFeature???HttpResponseFeature??????????????????????????????????????????????????????????????????

   1: public class DefaultHttpRequest : HttpRequest
   2: {
   3:     public IHttpRequestFeature RequestFeature { get; }
   4:     public DefaultHttpRequest(DefaultHttpContext context)
   5:     {
   6:         this.RequestFeature = context.HttpContextFeatures.Get<IHttpRequestFeature>();
   7:     }
   8:     public override Uri Url
   9:     {
  10:         get { return this.RequestFeature.Url; }
  11:     }
  12: }
  13:?? 
  14: public class DefaultHttpResponse : HttpResponse
  15: {
  16:     public IHttpResponseFeature ResponseFeature { get; }
  17:?? 
  18:     public override Stream OutputStream
  19:     {
  20:         get { return this.ResponseFeature.OutputStream; }
  21:     }
  22:?? 
  23:     public override string ContentType
  24:     {
  25:         get { return this.ResponseFeature.ContentType; }
  26:         set { this.ResponseFeature.ContentType = value; }
  27:     }
  28:?? 
  29:     public override int StatusCode
  30:     {
  31:         get { return this.ResponseFeature.StatusCode; }
  32:         set { this.ResponseFeature.StatusCode = value; }
  33:     }
  34:?? 
  35:     public DefaultHttpResponse(DefaultHttpContext context)
  36:     {
  37:         this.ResponseFeature = context.HttpContextFeatures.Get<IHttpResponseFeature>();
  38:     }
  39: }

????????????DefaultHttpContext???????????????????????????????????????????????????????????????HttpApplication?????????HostingApplication??????????????????????????????????????????????????????HttpContext??????????????????????????????????????????????????????????????????????????????????????????????????????RequestDelegate??????????????????????????????HttpApplication????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Application?????????RequestDelegate?????????

   1: public class HostingApplication : IHttpApplication<Context>
   2: {
   3:     public RequestDelegate Application { get; }
   4:?? 
   5:     public HostingApplication(RequestDelegate application)
   6:     {
   7:         this.Application = application;
   8:     }
   9:?? 
  10:     public Context CreateContext(IFeatureCollection contextFeatures)
  11:     {
  12:         HttpContext httpContext = new DefaultHttpContext(contextFeatures);
  13:         return new Context
  14:         {
  15:             HttpContext     = httpContext,
  16:             StartTimestamp     = Stopwatch.GetTimestamp()
  17:         };
  18:     }
  19:?? 
  20:     public void DisposeContext(Context context, Exception exception) 
  21:        => context.Scope?.Dispose();
  22:?? 
  23:     public Task ProcessRequestAsync(Context context) 
  24:        => this.Application(context.HttpContext);
  25: }

8?????????????????????HostingApplication??????????????????????????????????????????????????????????????????RequestDelegate???????????????????????????????????????????????????????????????ProcessRequestAsync????????????????????????????????????????????????????????????CreateContext?????????????????????????????????????????????????????????HTTP????????????FeatureCollection??????????????????DefaultHttpContext??????????????????????????????Context?????????????????????DisposeContext?????????????????????????????????Context?????????Scope?????????Dispose???????????????Scope????????????????????????????????????Context??????????????????Scope????????????????????????

????????????????????????UML?????????HTTP????????????????????????/??????????????????????????????????????????????????????????????????????????????HTTP????????????????????????HttpContext???????????????????????????HttpContext???????????????????????????????????????????????????????????????????????????HttpRequest???HttpResponse?????????ASP.NET Core ???????????????HttpContext?????????DefaultHttpContext?????????????????????????????????????????????DefaultHttpRequst???DefaultHttpResponse???????????????DefaultHttpContext?????????????????????HTTP??????????????????????????????????????????????????????????????????????????????????????????IHttpRequestFeature???IHttpResponseFeature?????????DefaultHttpRequst???DefaultHttpResponse????????????????????????????????????

?????????????????????????????????IServer??????????????????????????????????????????????????????????????????????????????????????????Start??????????????????Start?????????????????????????????????????????????????????????????????????HTTP??????????????????????????????????????????????????????HttpApplication???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpApplication????????????????????????????????????????????????????????????

   1: public interface IServer
   2: {
   3:     void Start<TContext>(IHttpApplication<TContext> application);
   4: }

???????????????????????????????????????????????????????????????????????????HttpListenerServer??????????????????????????????????????????????????????????????????HttpListener?????????????????????????????????????????????????????????????????????????????????????????????????????????HttpListenerServer??????????????????HttpListener???????????????????????????????????????????????????????????????????????????????????????https://localhost:3721/?????????

   1: public class HttpListenerServer : IServer
   2: {
   3:     public HttpListener Listener { get; }
   4:?? 
   5:     public HttpListenerServer(string url)
   6:     {
   7:         this.Listener = new HttpListener();
   8:         this.Listener.Prefixes.Add(url ?? "https://localhost:3721/");
   9:     }
  10:?? 
  11:     public void Start<TContext>(IHttpApplication<TContext> application)
  12:     {
  13:         this.Listener.Start();
  14:         while (true)
  15:         {
  16:             HttpListenerContext httpListenerContext = this.Listener.GetContext();
  17:?? 
  18:             HttpListenerContextFeature feature = new HttpListenerContextFeature(httpListenerContext);
  19:             FeatureCollection contextFeatures = new FeatureCollection();
  20:             contextFeatures.Set<IHttpRequestFeature>(feature);
  21:             contextFeatures.Set<IHttpResponseFeature>(feature);
  22:             TContext context = application.CreateContext(contextFeatures);
  23:?? 
  24:             application.ProcessRequestAsync(context)
  25:                 .ContinueWith(_ => httpListenerContext.Response.Close())
  26:                 .ContinueWith(_ => application.DisposeContext(context, _.Exception));
  27:         }
  28:     }
  29: }

???Start????????????????????????HttpListener???Start?????????????????????????????????HTTP?????????HTTP?????????????????????????????????????????????HttpListenerContext??????????????????HttpListener???GetContext??????????????????????????????????????????????????????????????????????????????HttpListenerContextFeature????????????????????????????????????IHttpRequestFeature???IHttpResponseFeature??????????????????FeatureCollection???????????????????????????HttpApplication??????????????????????????????CreateContext?????????????????????????????????ProcessRequestAsync????????????????????????????????????????????????????????????????????????????????????????????????????????????HttpApplication?????????DisposeContext????????????????????????????????????

???WebHost???????????????????????????????????????????????????????????????????????????????????????????????????ServerFactory????????????ServerFactory?????????????????????IServerFactory???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CreateServer????????????????????????HttpListenerServer???????????????HttpListenerServerFactory????????????????????????????????????????????????????????????CreateServer??????????????????HttpListenerServer?????????

   1: public interface IServerFactory
   2: {
   3:     IServer CreateServer();
   4: }
   5:?? 
   6: public class HttpListenerServerFactory : IServerFactory
   7: {
   8:     private string listenUrl;
   9:?? 
  10:     public HttpListenerServerFactory(string listenUrl = null)
  11:     {
  12:         this.listenUrl = listenUrl?? "https://localhost:3721/";
  13:     }
  14:?? 
  15:     public IServer CreateServer()
  16:     {
  17:         return new HttpListenerServer(listenUrl);
  18:     }
  19: }

9???????????????UML????????????????????????????????????/????????????????????????????????????IServer???????????????????????????????????????????????????????????????????????????????????????????????????HttpListenerServer????????????HttpListener????????????????????????????????????HttpListenerServer??????????????????HTTP????????????????????????????????????HTTP?????????????????????????????????HttpListenerContextFeature?????????HttpListenerContextFeature?????????????????????????????????????????????????????????IHttpRequestFeature???IHttpResponseFeature???HostingApplication??????????????????HttpListenerContextFeature???????????????DefaultHttpContext?????????

??


????????????????????????HTTP??????
?????????????????????????????????????????????????????????????????????????????????
????????????????????????HTTP?????????
???????????????????????????????????????


??????????????????
??????????????????????????????A
?????????www.weibo.com/artech
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????

最後更新:2017-10-25 14:04:35

  上一篇:go  The .NET of Tomorrow
  下一篇:go  ASP.NET Core管道深度剖析(4):管道是如何建立起來的?