大气的游戏公司网站源码分享asp,游戏门户网站源码

各位老铁们好,相信很多人对大气的游戏公司网站源码分享asp都不是特别的了解,因此呢,今天就来为大家分享下关于大气的游戏公司网站源码分享asp以及游戏门户网站源码的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

Intro

HttpContext可能是最为常用的一个类了,HttpContext是请求上下文,包含了所有的请求信息以及响应信息,以及一些自定义的用于在不同中间件中传输数据的信息

来看一下HttpContext的定义:

CopypublicclassHttpContext\n{\npublicIServiceProviderRequestServices{get;set;}\n\npublicHttpRequestRequest{get;set;}\n\npublicHttpResponseResponse{get;set;}\n\npublicIFeatureCollectionFeatures{get;set;}\n\npublicHttpContext(IFeatureCollectionfeatureCollection)\n{\nFeatures=featureCollection;\nRequest=newHttpRequest(featureCollection);\nResponse=newHttpResponse(featureCollection);\n}\n}\n

HttpRequest即为请求信息对象,包含了所有请求相关的信息,

HttpResponse为响应信息对象,包含了请求对应的响应信息

RequestServices为asp.netcore里的RequestServices,代表当前请求的服务提供者,可以使用它来获取具体的服务实例

Features为asp.netcore里引入的对象,可以用来在不同中间件中传递信息和用来解耦合

,下面我们就来看下HttpRequest和HttpResponse是怎么实现的

HttpRequest:

CopypublicclassHttpRequest\n{\nprivatereadonlyIRequestFeature_requestFeature;\n\npublicHttpRequest(IFeatureCollectionfeatureCollection)\n{\n_requestFeature=featureCollection.Get<IRequestFeature>();\n}\n\npublicUriUrl=>_requestFeature.Url;\n\npublicNameValueCollectionHeaders=>_requestFeature.Headers;\n\npublicstringMethod=>_requestFeature.Method;\n\npublicstringHost=>_requestFeature.Url.Host;\n\npublicStreamBody=>_requestFeature.Body;\n}\n

HttpResponse:

CopypublicclassHttpResponse\n{\nprivatereadonlyIResponseFeature_responseFeature;\n\npublicHttpResponse(IFeatureCollectionfeatureCollection)\n{\n_responseFeature=featureCollection.Get<IResponseFeature>();\n}\n\npublicboolResponseStarted=>_responseFeature.Body.Length>0;\n\npublicintStatusCode\n{\nget=>_responseFeature.StatusCode;\nset=>_responseFeature.StatusCode=value;\n}\n\npublicasyncTaskWriteAsync(byte[]responseBytes)\n{\nif(_responseFeature.StatusCode<=0)\n{\n_responseFeature.StatusCode=200;\n}\nif(responseBytes!=null&&responseBytes.Length>0)\n{\nawait_responseFeature.Body.WriteAsync(responseBytes);\n}\n}\n}\n

Features

上面我们已经提到了Web服务器通过IRequestFeature/IResponseFeature来实现不同web服务器和应用程序的解耦,web服务器只需要提供自己的RequestFeature/ResponseFeature即可

为了抽象不同的Web服务器,我们需要定义一个IServer的抽象接口,定义如下:

CopypublicinterfaceIServer\n{\nTaskStartAsync(Func<HttpContext,Task>requestHandler,CancellationTokencancellationToken=default);\n}\n

IServer定义了一个StartAsync方法,用来启动Web服务器,

StartAsync方法有两个参数,一个是requestHandler,是一个用来处理请求的委托,另一个是取消令牌用来停止web服务器

示例使用了HttpListener来实现了一个简单Web服务器,HttpListenerServer定义如下:

CopypublicclassHttpListenerServer:IServer\n{\nprivatereadonlyHttpListener_listener;\nprivatereadonlyIServiceProvider_serviceProvider;\n\npublicHttpListenerServer(IServiceProviderserviceProvider,IConfigurationconfiguration)\n{\n_listener=newHttpListener();\nvarurls=configuration.GetAppSetting(&34;)?.Split(&39;);\nif(urls!=null&&urls.Length>0)\n{\nforeach(varurlinurls\n.Where(u=>u.IsNotNullOrEmpty())\n.Select(u=>u.Trim())\n.Distinct()\n)\n{\n//Prefixesmustendinaforwardslash(&34;)\n//https://stackoverflow.com/questions/26157475/use-of-httplistener\n_listener.Prefixes.Add(url.EndsWith(&34;)?url:$&34;);\n}\n}\nelse\n{\n_listener.Prefixes.Add(&34;);\n}\n\n_serviceProvider=serviceProvider;\n}\n\npublicasyncTaskStartAsync(Func<HttpContext,Task>requestHandler,CancellationTokencancellationToken=default)\n{\n_listener.Start();\nif(_listener.IsListening)\n{\nConsole.WriteLine(&34;);\nConsole.WriteLine(_listener.Prefixes.StringJoin(&34;));\n}\nwhile(!cancellationToken.IsCancellationRequested)\n{\nvarlistenerContext=await_listener.GetContextAsync();\n\nvarfeatureCollection=newFeatureCollection();\nfeatureCollection.Set(listenerContext.GetRequestFeature());\nfeatureCollection.Set(listenerContext.GetResponseFeature());\n\nusing(varscope=_serviceProvider.CreateScope())\n{\nvarhttpContext=newHttpContext(featureCollection)\n{\nRequestServices=scope.ServiceProvider,\n};\n\nawaitrequestHandler(httpContext);\n}\nlistenerContext.Response.Close();\n}\n_listener.Stop();\n}\n}\n

HttpListenerServer实现的RequestFeature/ResponseFeatue

CopypublicclassHttpListenerRequestFeature:IRequestFeature\n{\nprivatereadonlyHttpListenerRequest_request;\n\npublicHttpListenerRequestFeature(HttpListenerContextlistenerContext)\n{\n_request=listenerContext.Request;\n}\n\npublicUriUrl=>_request.Url;\npublicstringMethod=>_request.HttpMethod;\npublicNameValueCollectionHeaders=>_request.Headers;\npublicStreamBody=>_request.InputStream;\n}\n\npublicclassHttpListenerResponseFeature:IResponseFeature\n{\nprivatereadonlyHttpListenerResponse_response;\n\npublicHttpListenerResponseFeature(HttpListenerContexthttpListenerContext)\n{\n_response=httpListenerContext.Response;\n}\n\npublicintStatusCode{get=>_response.StatusCode;set=>_response.StatusCode=value;}\n\npublicNameValueCollectionHeaders\n{\nget=>_response.Headers;\nset\n{\n_response.Headers=newWebHeaderCollection();\nforeach(varkeyinvalue.AllKeys)\n_response.Headers.Add(key,value[key]);\n}\n}\n\npublicStreamBody=>_response.OutputStream;\n}\n\n

为了方便使用,为HttpListenerContext定义了两个扩展方法,就是上面HttpListenerServer中的GetRequestFeature/GetResponseFeature:

CopypublicstaticclassHttpListenerContextExtensions\n{\npublicstaticIRequestFeatureGetRequestFeature(thisHttpListenerContextcontext)\n{\nreturnnewHttpListenerRequestFeature(context);\n}\n\npublicstaticIResponseFeatureGetResponseFeature(thisHttpListenerContextcontext)\n{\nreturnnewHttpListenerResponseFeature(context);\n}\n}\n

RequestDelegate39;srequestpipeline.\n///</summary>\npublicinterfaceIApplicationBuilder\n{\n///<summary>\n///Getsorsetsthe<seecref=&34;/>thatprovidesaccesstotheapplication&39;sserverprovides.\n///</summary>\nIFeatureCollectionServerFeatures{get;}\n\n///<summary>\n///Getsakey/valuecollectionthatcanbeusedtosharedatabetweenmiddleware.\n///</summary>\nIDictionary<string,object>Properties{get;}\n\n///<summary>\n///Addsamiddlewaredelegatetotheapplication&34;middleware&34;T:Microsoft.AspNetCore.Builder.IApplicationBuilder&34;T:Microsoft.AspNetCore.Builder.IApplicationBuilder&34;P:Microsoft.AspNetCore.Builder.IApplicationBuilder.Properties&34;T:Microsoft.AspNetCore.Builder.IApplicationBuilder&34;T:Microsoft.AspNetCore.Builder.IApplicationBuilder&

通过除了Web服务器之外,还有一个WebHost的概念,可以简单的这样理解,一个Web服务器上可以有多个WebHost,就像IIS/nginx(WebServer)可以host多个站点

可以说WebHost离我们的应用更近,所以我们还需要IHost来托管应用

CopypublicinterfaceIHost\n{\nTaskRunAsync(CancellationTokencancellationToken=default);\n}\n

WebHost定义:

CopypublicclassWebHost:IHost\n{\nprivatereadonlyFunc<HttpContext,Task>_requestDelegate;\nprivatereadonlyIServer_server;\n\npublicWebHost(IServiceProviderserviceProvider,Func<HttpContext,Task>requestDelegate)\n{\n_requestDelegate=requestDelegate;\n_server=serviceProvider.GetRequiredService<IServer>();\n}\n\npublicasyncTaskRunAsync(CancellationTokencancellationToken=default)\n{\nawait_server.StartAsync(_requestDelegate,cancellationToken).ConfigureAwait(false);\n}\n}\n

为了方便的构建Host对象,引入了HostBuilder来方便的构建一个Host,定义如下:

CopypublicinterfaceIHostBuilder\n{\nIHostBuilderConfigureConfiguration(Action<IConfigurationBuilder>configAction);\n\nIHostBuilderConfigureServices(Action<IConfiguration,IServiceCollection>configureAction);\n\nIHostBuilderInitialize(Action<IConfiguration,IServiceProvider>initAction);\n\nIHostBuilderConfigureApplication(Action<IConfiguration,IAsyncPipelineBuilder<HttpContext>>configureAction);\n\nIHostBuild();\n}\n\n

WebHostBuilder:

CopypublicclassWebHostBuilder:IHostBuilder\n{\nprivatereadonlyIConfigurationBuilder_configurationBuilder=newConfigurationBuilder();\nprivatereadonlyIServiceCollection_serviceCollection=newServiceCollection();\n\nprivateAction<IConfiguration,IServiceProvider>_initAction=null;\n\nprivatereadonlyIAsyncPipelineBuilder<HttpContext>_requestPipeline=PipelineBuilder.CreateAsync<HttpContext>(context=>\n{\ncontext.Response.StatusCode=404;\nreturnTask.CompletedTask;\n});\n\npublicIHostBuilderConfigureConfiguration(Action<IConfigurationBuilder>configAction)\n{\nconfigAction?.Invoke(_configurationBuilder);\nreturnthis;\n}\n\npublicIHostBuilderConfigureServices(Action<IConfiguration,IServiceCollection>configureAction)\n{\nif(null!=configureAction)\n{\nvarconfiguration=_configurationBuilder.Build();\nconfigureAction.Invoke(configuration,_serviceCollection);\n}\n\nreturnthis;\n}\n\npublicIHostBuilderConfigureApplication(Action<IConfiguration,IAsyncPipelineBuilder<HttpContext>>configureAction)\n{\nif(null!=configureAction)\n{\nvarconfiguration=_configurationBuilder.Build();\nconfigureAction.Invoke(configuration,_requestPipeline);\n}\nreturnthis;\n}\n\npublicIHostBuilderInitialize(Action<IConfiguration,IServiceProvider>initAction)\n{\nif(null!=initAction)\n{\n_initAction=initAction;\n}\n\nreturnthis;\n}\n\npublicIHostBuild()\n{\nvarconfiguration=_configurationBuilder.Build();\n_serviceCollection.AddSingleton<IConfiguration>(configuration);\nvarserviceProvider=_serviceCollection.BuildServiceProvider();\n\n_initAction?.Invoke(configuration,serviceProvider);\n\nreturnnewWebHost(serviceProvider,_requestPipeline.Build());\n}\n\npublicstaticWebHostBuilderCreateDefault(string[]args)\n{\nvarwebHostBuilder=newWebHostBuilder();\nwebHostBuilder\n.ConfigureConfiguration(builder=>builder.AddJsonFile(&34;,true,true))\n.UseHttpListenerServer()\n;\n\nreturnwebHostBuilder;\n}\n}\n

这里的示例我在IHostBuilder里增加了一个Initialize的方法来做一些初始化的操作,我觉得有些数据初始化配置初始化等操作应该在这里操作,而不应该在Startup的Configure方法里处理,这样Configure方法可以更纯粹一些,只配置asp.netcore的请求管道,这纯属个人意见,没有对错之分

这里Host的实现和asp.netcore的实现不同,有需要的可以深究源码,在asp.netcore2.x的版本里是有一个IWebHost的,在asp.netcore3.x以及.net5里是没有IWebHost的取而代之的是通用主机IHost,通过实现了一个IHostedService来实现WebHost的

Run34;/favicon.ico&34;test&34;test&34;middleware1,requestPath:{context.Request.Url.AbsolutePath}&34;middleware2,requestPath:{context.Request.Url.AbsolutePath}&34;middleware3,requestPath:{context.Request.Url.AbsolutePath}&34;HelloMiniAsp.NetCore&34;exiting…”);\nCts.Cancel();\n}\n}\n

在示例项目目录下执行dotnetrun,并访问http://localhost:5100/:

仔细观察浏览器console或network的话,会发现还有一个请求,浏览器会默认请求/favicon.ico获取网站的图标

因为我们针对这个请求没有任何中间件的处理,所以直接返回了404

在访问/test,可以看到和刚才的输出完全不同,因为这个请求走了另外一个分支,相当于asp.netcore里Map/MapWhen的效果,另外Run代表里中间件的中断,不会执行后续的中间件

OK,关于大气的游戏公司网站源码分享asp和游戏门户网站源码的内容到此结束了,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平