ASP.NET Core?????????????????????3???????????????????????????HTTP????????????-??????-????????????-?????????
????????????ASP.NET Core????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HTTP????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????HTTP?????????
??????
??????HttpApplication
?????? FeatureCollection
?????? HostingApplication
??????HttpContext
?????? DefaultHttpContext
?????? HostingApplication
?????? ??????
???????????????
?????? HttpListenerServer
?????? ServerFactory
?????? ??????
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: }
???????????????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?????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????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: }
?????????????????????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: }
???????????????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