下面最先介绍HttpRuntime的Web.config里的配置
<httpRuntime
executionTimeout = "number"
maxRequestLength = "number"
requestLengthDiskThreshold = "number"
useFullyQualifiedRedirectUrl = "[True|False]"
minFreeThreads = "number"
minLocalRequestFreeThreads = "number"
appRequestQueueLimit = "number"
enableKernelOutputCache = "[True|False]"
enableVersionHeader = "[True|False]"
apartmentThreading = "[True|False]"
requireRootedSaveAsPath = "[True|False]"
enable = "[True|False]"
sendCacheControlHeader = "[True|False]"
shutdownTimeout = "number"
delayNotificationTimeout = "number"
waitChangeNotification = "number"
maxWaitChangeNotification = "number"
enableHeaderChecking = "[True|False]"
/>
通过上面的配置说明, 下面是在Web.Config里节点的设置
<configuration>
<system.web>
<httpRuntime maxRequestLength="4000"
enable = "True"
requestLengthDiskThreshold="512
useFullyQualifiedRedirectUrl="True"
executionTimeout="45"
versionHeader="1.1.4128"/>
system.web>
configuration>
IIS 所收到的对某 Microsoft ASP.NET 页面的每个请求都被移交给 ASP.NET HTTP 管线。HTTP 管线由一系列托管对象组成,这些对象按顺序处理该请求,并完成从 URL 到普通 HTML 文本的转换。HTTP 管线的入口点是 HttpRuntime 类。ASP.NET 基础结构为辅助进程中所承载的每个 AppDomain 创建此类的一个实例请注意,该辅助进程为当前正在运行的每个 ASP.NET 应用程序维护一个不同的 AppDomain。
要激活 HTTP 管道,可以创建一个 HttpRuntime 类的新实例,然后调用其 ProcessRequest 方法。一个完整的页面请求会包括下面的流程:
首先被WWW服务器截获(inetinfo.exe进程), 该进程首先判断页面后缀, 然后根据IIS中配置决定调用具体的扩展程序。aspx就会调用aspnet_isapi.dll,
然后由aspnet_isapi.dll发送给w3wp.exe(iis 工作者进程,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe)。
接下来在w3wp.exe调用.NET类库进行具体处理,顺序如下:ISAPIRuntim, HttpRuntime, HttpApplicationFactory, HttpApplication, HttpModule, HttpHandlerFactory, HttpHandler
ISAPIRuntime:主要作用是调用一些非托管代码生成HttpWorkerRequest对象,HttpWorkerRequest对象包含当前请求的所有信息,然后传递给HttpRuntime
HttpRuntime:根据HttpWorkerRequest对象生成HttpContext,HttpContext包含request、response等属性, 再调用HttpApplicationFactory来生成IHttpHandler, 调用HttpApplication对象执行请求
HttpApplicationFactory: 生成一个HttpApplication对象
HttpApplication:进行HttpModule的初始化,HttpApplication创建针对此Http请求的 HttpContext对象
HttpModule: 当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
HttpHandlerFactory:把用户request 转发到HttpHandlerFactory,再由HttpHandlerFactory实例化HttpHandler对象来相应request
HttpHandle:Http处理程序,处理页面请求
从上面看出HttpRuntime其中有一个ProcessRequest 方法
public static void ProcessRequest(HttpWorkerRequest wr); //驱动所有 ASP.NET Web 处理执行。伪代码如下:
public static void HttpRuntime.ProcessRequest(HttpWorkerRequest wr)
{
// 检查当前调用者有没有作为ASP.NET宿主(Host)的权限
InternalSecurityPermissions.AspNetHostingPermissionLevelMedium.Demand();
if(wr == null)
{
throw new ArgumentNullException("custom");
}
RequestQueue queue = HttpRuntime._theRuntime._requestQueue;
if(queue != null)
{
// 将参数中的Web页面请求放入请求队列中, 并从队列中使用FIFO策略获取一个页面请求
wr = queue.GetRequestToExecute(wr);
}
if(wr != null)
{
HttpRuntime.CalculateWaitTimeAndUpdatePerfCounter(wr); // 更新性能计数器
HttpRuntime.ProcessRequestNow(wr); // 实际完成页面请求工作
}
}
ProcessRequestNow函数则直接调用缺省HttpRuntime实例的ProcessRequestInternal函数完成实际页面请求工作,伪代码如下:
internal static void HttpRuntime.ProcessRequestNow(HttpWorkerRequest wr)
{
HttpRuntime._theRuntime.ProcessRequestInternal(wr);
}
ProcessRequestInternal函数逻辑稍微复杂一些,大致可分为四个部分:
检查当前HttpRuntime实例是否第一次被调用,如果是第一次调用则通过FirstRequestInit函数初始化
调用HttpResponse.InitResponseWriter函数初始化页面请求的返回对象HttpWorkerRequest.Response
调用HttpApplicationFactory.GetApplicationInstance函数获取当前 Web 应用程序实例
使用Web应用程序实例完成实际的页面请求工作
伪代码如下:
Code
private void HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
{
// 构造 HTTP 调用上下文对象
HttpContext ctxt = new HttpContext(wr, 0);
// 设置发送结束异步回调函数
wr.SetEndOfSendNotification(this._asyncEndOfSendCallback, ctxt);
// 更新请求计数器
Interlocked.Increment(&(this._activeRequestCount));
try
{
// 检查当前HttpRuntime实例是否第一次被调用
if(this._beforeFirstRequest)
{
lock(this)
{
// 使用 Double-Checked 模式 避免冗余锁定
if(this._beforeFirstRequest)
{
this._firstRequestStartTime = DateTime.UtcNow;
this.FirstRequestInit(ctxt); // 初始化当前 HttpRuntime 运行时环境
this._beforeFirstRequest = false;
}
}
}
// 根据配置文件设置,扮演具有较高特权的角色
ctxt.Impersonation.Start(true, false);
try
{
// 初始化页面请求的返回对象
ctxt.Response.InitResponseWriter();
}
finally
{
ctxt.Impersonation.Stop();
}
// 获取当前 Web 应用程序实例
IHttpHandler handler = HttpApplicationFactory.GetApplicationInstance(ctxt);
if (handler == null)
{
throw new HttpException(HttpRuntime.FormatResourceString("Unable_create_app_object"));
}
// 使用Web应用程序实例完成实际的页面请求工作
if((handler as IHttpAsyncHandler) != null)
{
IHttpAsyncHandler asyncHandler = ((IHttpAsyncHandler) handler);
ctxt.AsyncAppHandler = asyncHandler;
// 使用异步处理机制
asyncHandler.BeginProcessRequest(ctxt, this._handlerCompletionCallback, ctxt);
}
else
{
handler.ProcessRequest(ctxt);
this.FinishRequest(ctxt.WorkerRequest, ctxt, null);
}
}
catch(Exception E)
{
ctxt.Response.InitResponseWriter();
this.FinishRequest(wr, ctxt, E);
}
}
HttpRuntime.ProcessRequestInternal函数中调用了HttpApplicationFactory.GetApplicationInstance函数获取当前 Web 应用程序实例。至少HttpRuntime已经完完成,将转进HttpApplicationFactory阶段流程。大家可以看到,围绕HttpRuntime的函数都有一个HttpWorkerRequest参数,下面简单介绍一下这个参数的作用。在ISAPIRuntime阶段,调用一些非托管代码生成HttpWorkerRequest对象,该对象包含当前请求的所有信息,然后传递给HttpRuntime,这里生成的HttpWorkerRequest对象可以直接在我们的页面里调用.
IServiceProvider provider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
然后可以通过wr来调用里面的方法。关于HttpWorkerRequest类里面包含的方法,从其元数据里面可以看到,如下:
Code
public abstract class HttpWorkerRequest
{
// 摘要:
// 指定 AcceptHTTP 标头的索引号。
public const int HeaderAccept = 20;
//
// 摘要:
// 指定 Accept-CharsetHTTP 标头的索引号。
public const int HeaderAcceptCharset = 21;
//
// 摘要:
// 指定 Accept-EncodingHTTP 标头的索引号。
public const int HeaderAcceptEncoding = 22;
//
// 摘要:
// 指定 Accept-LanguageHTTP 标头的索引号。
public const int HeaderAcceptLanguage = 23;
//
// 摘要:
// 指定 Accept-RangesHTTP 标头的索引号。
public const int HeaderAcceptRanges = 20;
//
// 摘要:
// 指定 AgeHTTP 标头的索引号。
public const int HeaderAge = 21;
//
// 摘要:
// 指定 AllowHTTP 标头的索引号。
public const int HeaderAllow = 10;
//
// 摘要:
// 指定 AuthorizationHTTP 标头的索引号。
public const int HeaderAuthorization = 24;
//
// 摘要:
// 表示 HTTPCache-ControlHTTP 标头的索引。
public const int HeaderCacheControl = 0;
//
// 摘要:
// 指定 ConnectionHTTP 标头的索引号。
public const int HeaderConnection = 1;
//
// 摘要:
// 指定 Content-EncodingHTTP 标头的索引号。
public const int HeaderContentEncoding = 13;
//
// 摘要:
// 指定 Content-LanguageHTTP 标头的索引号。
public const int HeaderContentLanguage = 14;
//
// 摘要:
// 指定 Content-LengthHTTP 标头的索引号。
public const int HeaderContentLength = 11;
//
// 摘要:
// 指定 Content-LocationHTTP 标头的索引号。
public const int HeaderContentLocation = 15;
//
// 摘要:
// 指定 Content-MD5HTTP 标头的索引号。
public const int HeaderContentMd5 = 16;
//
// 摘要:
// 指定 Content-RangeHTTP 标头的索引号。
public const int HeaderContentRange = 17;
//
// 摘要:
// 指定 Content-TypeHTTP 标头的索引号。
public const int HeaderContentType = 12;
//
// 摘要:
// 指定 CookieHTTP 标头的索引号。
public const int HeaderCookie = 25;
//
// 摘要:
// 指定 DateHTTP 标头的索引号。
public const int HeaderDate = 2;
//
// 摘要:
// 指定 ETagHTTP 标头的索引号。
public const int HeaderEtag = 22;
//
// 摘要:
// 指定 ExceptHTTP 标头的索引号。
public const int HeaderExpect = 26;
//
// 摘要:
// 指定 ExpiresHTTP 标头的索引号。
public const int HeaderExpires = 18;
//
// 摘要:
// 指定 FromHTTP 标头的索引号。
public const int HeaderFrom = 27;
//
// 摘要:
// 指定 HostHTTP 标头的索引号。
public const int HeaderHost = 28;
//
// 摘要:
// 指定 If-MatchHTTP 标头的索引号。
public const int HeaderIfMatch = 29;
//
// 摘要:
// 指定 If-Modified-SinceHTTP 标头的索引号。
public const int HeaderIfModifiedSince = 30;
//
// 摘要:
// 指定 If-None-MatchHTTP 标头的索引号。
public const int HeaderIfNoneMatch = 31;
//
// 摘要:
// 指定 If-RangeHTTP 标头的索引号。
public const int HeaderIfRange = 32;
//
// 摘要:
// 指定 If-Unmodified-SinceHTTP 标头的索引号。
public const int HeaderIfUnmodifiedSince = 33;
//
// 摘要:
// 指定 Keep-AliveHTTP 标头的索引号。
public const int HeaderKeepAlive = 3;
//
// 摘要:
// 指定 Last-ModifiedHTTP 标头的索引号。
public const int HeaderLastModified = 19;
//
// 摘要:
// 指定 LocationHTTP 标头的索引号。
public const int HeaderLocation = 23;
//
// 摘要:
// 指定 Max-ForwardsHTTP 标头的索引号。
public const int HeaderMaxForwards = 34;
//
// 摘要:
// 指定 PragmaHTTP 标头的索引号。
public const int HeaderPragma = 4;
//
// 摘要:
// 指定 Proxy-AuthenticateHTTP 标头的索引号。
public const int HeaderProxyAuthenticate = 24;
//
// 摘要:
// 指定 Proxy-AuthorizationHTTP 标头的索引号。
public const int HeaderProxyAuthorization = 35;
//
// 摘要:
// 指定 RangeHTTP 标头的索引号。
public const int HeaderRange = 37;
//
// 摘要:
// 指定 RefererHTTP 标头的索引号。
public const int HeaderReferer = 36;
//
// 摘要:
// 指定 Retry-AfterHTTP 标头的索引号。
public const int HeaderRetryAfter = 25;
//
// 摘要:
// 指定 ServerHTTP 标头的索引号。
public const int HeaderServer = 26;
//
// 摘要:
// 指定 Set-CookieHTTP 标头的索引号。
public const int HeaderSetCookie = 27;
//
// 摘要:
// 指定 TEHTTP 标头的索引号。
public const int HeaderTe = 38;
//
// 摘要:
// 指定 TrailerHTTP 标头的索引号。
public const int HeaderTrailer = 5;
//
// 摘要:
// 指定 Transfer-EncodingHTTP 标头的索引号。
public const int HeaderTransferEncoding = 6;
//
// 摘要:
// 指定 UpgradeHTTP 标头的索引号。
public const int HeaderUpgrade = 7;
//
// 摘要:
// 指定 User-AgentHTTP 标头的索引号。
public const int HeaderUserAgent = 39;
//
// 摘要:
// 指定 VaryHTTP 标头的索引号。
public const int HeaderVary = 28;
//
// 摘要:
// 指定 ViaHTTP 标头的索引号。
public const int HeaderVia = 8;
//
// 摘要:
// 指定 WarningHTTP 标头的索引号。
public const int HeaderWarning = 9;
//
// 摘要:
// 指定 WWW-AuthenticateHTTP 标头的索引号。
public const int HeaderWwwAuthenticate = 29;
//
// 摘要:
// 指定请求的原因。
public const int ReasonCachePolicy = 2;
//
// 摘要:
// 指定请求的原因。
public const int ReasonCacheSecurity = 3;
//
// 摘要:
// 指定请求的原因。
public const int ReasonClientDisconnect = 4;
//
// 摘要:
// 指定请求的原因。默认值为 System.Web.HttpWorkerRequest.ReasonResponseCacheMiss。
public const int ReasonDefault = 0;
//
// 摘要:
// 指定请求的原因。
public const int ReasonFileHandleCacheMiss = 1;
//
// 摘要:
// 指定请求的原因。
public const int ReasonResponseCacheMiss = 0;
//
// 摘要:
// 指定 MaximumHTTP 请求标头的索引号。
public const int RequestHeaderMaximum = 40;
//
// 摘要:
// 指定 MaximumHTTP 响应标头的索引号。
public const int ResponseHeaderMaximum = 30;
// 摘要:
// 初始化 System.Web.HttpWorkerRequest 类的新实例。
protected HttpWorkerRequest();
// 摘要:
// 获取 Machine.config 文件的完整物理路径。
//
// 返回结果:
// Machine.config 文件的物理路径。
public virtual string MachineConfigPath { get; }
//
// 摘要:
// 获取 ASP.NET 二进制文件的安装目录的物理路径。
//
// 返回结果:
// ASP.NET 二进制文件的物理目录。
public virtual string MachineInstallDirectory { get; }
//
// 摘要:
// 获取当前请求的 Windows 跟踪 ID 的对应事件跟踪。
//
// 返回结果:
// 当前 ASP.NET 请求的跟踪 ID。
public virtual Guid RequestTraceIdentifier { get; }
//
// 摘要:
// 获取根 Web.config 文件的完整物理路径。
//
// 返回结果:
// 根 Web.config 文件的物理路径。
public virtual string RootWebConfigPath { get; }
// 摘要:
// 终止与客户端的连接。
public virtual void CloseConnection();
//
// 摘要:
// 由运行库使用以通知 System.Web.HttpWorkerRequest 当前请求的请求处理已完成。
public abstract void EndOfRequest();
//
// 摘要:
// 将所有挂起的响应数据发送到客户端。
//
// 参数:
// finalFlush:
// 如果这将是最后一次刷新响应数据,则为 true;否则为 false。
public abstract void FlushResponse(bool finalFlush);
//
// 摘要:
// 返回当前正在执行的服务器应用程序的虚拟路径。
//
// 返回结果:
// 当前应用程序的虚拟路径。
public virtual string GetAppPath();
//
// 摘要:
// 返回当前正在执行的服务器应用程序的物理路径。
//
// 返回结果:
// 当前应用程序的物理路径。
public virtual string GetAppPathTranslated();
//
// 摘要:
// 在派生类中被重写时,返回当前 URL 的应用程序池 ID。
//
// 返回结果:
// 始终返回 null。
public virtual string GetAppPoolID();
//
// 摘要:
// 获取从客户端读入的字节数。
//
// 返回结果:
// 包含读取的字节数的 Long。
public virtual long GetBytesRead();
//
// 摘要:
// 在派生类中被重写时,从客户端发出的请求获取证书字段(以 X.509 标准指定)。
//
// 返回结果:
// 包含整个证书内容流的字节数组。
public virtual byte[] GetClientCertificate();
//
// 摘要:
// 获取证书颁发者(以二进制格式表示)。
//
// 返回结果:
// 包含以二进制格式表示的证书颁发者的字节数组。
public virtual byte[] GetClientCertificateBinaryIssuer();
//
// 摘要:
// 在派生类中被重写时,返回用于编码客户端证书的 System.Text.Encoding 对象。
//
// 返回结果:
// 表示为整数的证书编码。
public virtual int GetClientCertificateEncoding();
//
// 摘要:
// 在派生类中被重写时,获取与客户端证书关联的 PublicKey 对象。
//
// 返回结果:
// 一个 PublicKey 对象。
public virtual byte[] GetClientCertificatePublicKey();
//
// 摘要:
// 在派生类中被重写时,则获取证书开始生效的日期。此日期随区域设置的不同而不同。
//
// 返回结果:
// 表示证书生效时间的 System.DateTime 对象。
public virtual DateTime GetClientCertificateValidFrom();
//
// 摘要:
// 获取证书到期日期。
//
// 返回结果:
// 表示证书失效日期的 System.DateTime 对象。
public virtual DateTime GetClientCertificateValidUntil();
//
// 摘要:
// 在派生类中被重写时,返回当前连接的 ID。
//
// 返回结果:
// 始终返回 0。
public virtual long GetConnectionID();
//
// 摘要:
// 在派生类中被重写时,返回所请求的 URI 的虚拟路径。
//
// 返回结果:
// 请求的 URI 的路径。
public virtual string GetFilePath();
//
// 摘要:
// 返回请求的 URI 的物理文件路径(并将其从虚拟路径转换成物理路径:例如,从“/proj1/page.aspx”转换成“c:\dir\page.aspx”)
//
// 返回结果:
// 请求的 URI 的已转换的物理文件路径。
public virtual string GetFilePathTranslated();
//
// 摘要:
// 返回请求标头的指定成员。
//
// 返回结果:
// 请求标头中返回的 HTTP 谓词。
public abstract string GetHttpVerbName();
//
// 摘要:
// 提供对请求的 HTTP 版本(如“HTTP/1.1”)的访问。
//
// 返回结果:
// 请求标头中返回的 HTTP 版本。
public abstract string GetHttpVersion();
//
// 摘要:
// 返回与指定的索引相对应的标准 HTTP 请求标头。
//
// 参数:
// index:
// 标头的索引。例如,System.Web.HttpWorkerRequest.HeaderAllow 字段。
//
// 返回结果:
// HTTP 请求标头。
public virtual string GetKnownRequestHeader(int index);
//
// 摘要:
// 返回指定的 HTTP 请求标头的索引号。
//
// 参数:
// header:
// 标头的名称。
//
// 返回结果:
// 在 header 参数中指定的 HTTP 请求标头的索引号。
public static int GetKnownRequestHeaderIndex(string header);
//
// 摘要:
// 返回指定的 HTTP 请求标头的名称。
//
// 参数:
// index:
// 标头的索引号。
//
// 返回结果:
// 在 index 参数中指定的 HTTP 请求标头的名称。
public static string GetKnownRequestHeaderName(int index);
//
// 摘要:
// 返回指定的 HTTP 响应标头的索引号。
//
// 参数:
// header:
// HTTP 标头的名称。
//
// 返回结果:
// 在 header 参数中指定的 HTTP 响应标头的索引号。
public static int GetKnownResponseHeaderIndex(string header);
//
// 摘要:
// 返回指定的 HTTP 响应标头的名称。
//
// 参数:
// index:
// 标头的索引号。
//
// 返回结果:
// 在 index 参数中指定的 HTTP 响应标头的名称。
public static string GetKnownResponseHeaderName(int index);
//
// 摘要:
// 提供对请求标头的指定成员的访问。
//
// 返回结果:
// 请求标头中返回的服务器 IP 地址。
public abstract string GetLocalAddress();
//
// 摘要:
// 提供对请求标头的指定成员的访问。
//
// 返回结果:
// 请求标头中返回的服务器端口号。
public abstract int GetLocalPort();
//
// 摘要:
// 返回具有 URL 扩展的资源的其他路径信息。即对于路径 /virdir/page.html/tail,GetPathInfo 值为 /tail。
//
// 返回结果:
// 资源的附加路径信息。
public virtual string GetPathInfo();
//
// 摘要:
// 返回 HTTP 请求正文已被读取的部分。
//
// 返回结果:
// HTTP 请求正文已被读取的部分。
public virtual byte[] GetPreloadedEntityBody();
//
// 摘要:
// 使用指定的缓冲区数据和字节偏移量获取 HTTP 请求正文当前已被读取的部分。
//
// 参数:
// buffer:
// 要读取的数据。
//
// offset:
// 开始读取的位置的字节偏移量。
//
// 返回结果:
// HTTP 请求正文已被读取的部分。
public virtual int GetPreloadedEntityBody(byte[] buffer, int offset);
//
// 摘要:
// 获取 HTTP 请求正文当前已被读取部分的长度。
//
// 返回结果:
// 一个整数,包含当前已读取的 HTTP 请求正文的长度。
public virtual int GetPreloadedEntityBodyLength();
//
// 摘要:
// 在派生类中被重写时,返回 HTTP 协议(HTTP 或 HTTPS)。
//
// 返回结果:
// 如果 System.Web.HttpWorkerRequest.IsSecure() 方法为 true,则为 HTTPS;否则,为 HTTP。
public virtual string GetProtocol();
//
// 摘要:
// 返回请求 URL 中指定的查询字符串。
//
// 返回结果:
// 请求查询字符串。
public abstract string GetQueryString();
//
// 摘要:
// 在派生类中被重写时,以字节数组的形式返回响应查询字符串。
//
// 返回结果:
// 包含响应的字节数组。
public virtual byte[] GetQueryStringRawBytes();
//
// 摘要:
// 返回附加了查询字符串的请求标头中包含的 URL 路径。
//
// 返回结果:
// 请求标头的原始 URL 路径。
public abstract string GetRawUrl();
//
// 摘要:
// 提供对请求标头的指定成员的访问。
//
// 返回结果:
// 客户端的 IP 地址。
public abstract string GetRemoteAddress();
//
// 摘要:
// 在派生类中被重写时,返回客户端计算机的名称。
//
// 返回结果:
// 客户端计算机的名称。
public virtual string GetRemoteName();
//
// 摘要:
// 提供对请求标头的指定成员的访问。
//
// 返回结果:
// 客户端的 HTTP 端口号。
public abstract int GetRemotePort();
//
// 摘要:
// 在派生类中被重写时,返回请求的原因。
//
// 返回结果:
// 原因代码。默认值为 ReasonResponseCacheMiss。
public virtual int GetRequestReason();
//
// 摘要:
// 在派生类中被重写时,返回本地服务器的名称。
//
// 返回结果:
// 本地服务器的名称。
public virtual string GetServerName();
//
// 摘要:
// 从与请求关联的服务器变量词典返回单个服务器变量。
//
// 参数:
// name:
// 请求的服务器变量的名称。
//
// 返回结果:
// 请求的服务器变量。
public virtual string GetServerVariable(string name);
//
// 摘要:
// 返回一个字符串,该字符串描述指定的 HTTP 状态代码的名称。
//
// 参数:
// code:
// HTTP 状态代码。
//
// 返回结果:
// 状态说明。例如,System.Web.HttpWorkerRequest.GetStatusDescription(System.Int32) (404)
// 返回“未找到”。
public static string GetStatusDescription(int code);
//
// 摘要:
// 获取整个 HTTP 请求正文的长度。
//
// 返回结果:
// 包含整个 HTTP 请求正文的长度的整数。
public virtual int GetTotalEntityBodyLength();
//
// 摘要:
// 返回非标准的 HTTP 请求标头值。
//
// 参数:
// name:
// 标头名称。
//
// 返回结果:
// 标头值。
public virtual string GetUnknownRequestHeader(string name);
//
// 摘要:
// 获取所有非标准的 HTTP 标头的名称/值对。
//
// 返回结果:
// 标头的名称/值对的数组。
[CLSCompliant(false)]
public virtual string[][] GetUnknownRequestHeaders();
//
// 摘要:
// 返回请求的 URI 的虚拟路径。
//
// 返回结果:
// 请求的 URI 的路径。
public abstract string GetUriPath();
//
// 摘要:
// 当在派生类中被重写时,返回当前连接的上下文 ID。
//
// 返回结果:
// 始终返回 0。
public virtual long GetUrlContextID();
//
// 摘要:
// 在派生类中被重写时,返回客户端的模拟标记。
//
// 返回结果:
// 表示客户端的模拟标记的值。默认值为 0。
public virtual IntPtr GetUserToken();
//
// 摘要:
// 获取请求虚拟路径的模拟标记。
//
// 返回结果:
// 请求虚拟路径的标记的非托管内存指针。
public virtual IntPtr GetVirtualPathToken();
//
// 摘要:
// 返回一个值,该值指示请求是否包含正文数据。
//
// 返回结果:
// 如果请求包含正文数据,则为 true;否则,为 false。
public bool HasEntityBody();
//
// 摘要:
// 返回一个值,该值指示是否已为当前的请求将 HTTP 响应标头发送到客户端。
//
// 返回结果:
// 如果 HTTP 响应标头已发送到客户端,则为 true;否则,为 false。
public virtual bool HeadersSent();
//
// 摘要:
// 返回一个值,该值指示客户端连接是否仍处于活动状态。
//
// 返回结果:
// 如果客户端连接仍处于活动状态,则为 true;否则,为 false。
public virtual bool IsClientConnected();
//
// 摘要:
// 返回一个值,该值指示是否所有请求数据都可用,以及是否不需要对客户端进行进一步读取。
//
// 返回结果:
// 如果所有请求数据都可用,则为 true;否则,为 false。
public virtual bool IsEntireEntityBodyIsPreloaded();
//
// 摘要:
// 返回一个指示连接是否使用 SSL 的值。
//
// 返回结果:
// 如果连接是 SSL 连接,则为 true;否则为 false。默认值为 false。
public virtual bool IsSecure();
//
// 摘要:
// 返回与指定虚拟路径相对应的物理路径。
//
// 参数:
// virtualPath:
// 虚拟路径。
//
// 返回结果:
// 与 virtualPath 参数中指定的虚拟路径相对应的物理路径。
public virtual string MapPath(string virtualPath);
//
// 摘要:
// 读取客户端的请求数据(在尚未预加载时)。
//
// 参数:
// buffer:
// 将数据读入的字节数组。
//
// size:
// 最多读取的字节数。
//
// 返回结果:
// 读取的字节数。
public virtual int ReadEntityBody(byte[] buffer, int size);
//
// 摘要:
// 使用指定的要从中读取数据的缓冲区、字节偏移量和最大字节数从客户端读取请求数据(当未预先加载时)。
//
// 参数:
// buffer:
// 将数据读入的字节数组。
//
// offset:
// 开始读取的位置的字节偏移量。
//
// size:
// 最多读取的字节数。
//
// 返回结果:
// 读取的字节数。
public virtual int ReadEntityBody(byte[] buffer, int offset, int size);
//
// 摘要:
// 将 Content-Length HTTP 标头添加到小于或等于 2 GB 的消息正文的响应。
//
// 参数:
// contentLength:
// 响应的长度(以字节为单位)。
public virtual void SendCalculatedContentLength(int contentLength);
//
// 摘要:
// 将 Content-Length HTTP 标头添加到大于 2 GB 的消息正文的响应。
//
// 参数:
// contentLength:
// 响应的长度(以字节为单位)。
public virtual void SendCalculatedContentLength(long contentLength);
//
// 摘要:
// 将标准 HTTP 标头添加到响应。
//
// 参数:
// index:
// 标头索引。例如 System.Web.HttpWorkerRequest.HeaderContentLength。
//
// value:
// 标头的值。
public abstract void SendKnownResponseHeader(int index, string value);
//
// 摘要:
// 将指定文件的内容添加到响应并指定文件中的起始位置和要发送的字节数。
//
// 参数:
// handle:
// 要发送的文件的句柄。
//
// offset:
// 文件中的起始位置。
//
// length:
// 要发送的字节数。
public abstract void SendResponseFromFile(IntPtr handle, long offset, long length);
//
// 摘要:
// 将指定文件的内容添加到响应并指定文件中的起始位置和要发送的字节数。
//
// 参数:
// filename:
// 要发送的文件的名称。
//
// offset:
// 文件中的起始位置。
//
// length:
// 要发送的字节数。
public abstract void SendResponseFromFile(string filename, long offset, long length);
//
// 摘要:
// 将字节数组中指定数目的字节添加到响应。
//
// 参数:
// data:
// 要发送的字节数组。
//
// length:
// 要发送的字节数(从第一个字节开始)。
public abstract void SendResponseFromMemory(byte[] data, int length);
//
// 摘要:
// 将内存块中指定数目的字节添加到响应。
//
// 参数:
// data:
// 指向内存块的非托管指针。
//
// length:
// 要发送的字节数。
public virtual void SendResponseFromMemory(IntPtr data, int length);
//
// 摘要:
// 指定响应的 HTTP 状态代码和状态说明,例如 SendStatus(200, "Ok")。
//
// 参数:
// statusCode:
// 要发送的状态代码
//
// statusDescription:
// 要发送的状态说明。
public abstract void SendStatus(int statusCode, string statusDescription);
//
// 摘要:
// 将非标准 HTTP 标头添加到响应。
//
// 参数:
// name:
// 要发送的标头的名称。
//
// value:
// 标头的值。
public abstract void SendUnknownResponseHeader(string name, string value);
//
// 摘要:
// 在发送所有响应数据后注册可选通知。
//
// 参数:
// callback:
// 在发送所有数据(带外)后调用的通知回调。
//
// extraData:
// 回调的附加参数。
public virtual void SetEndOfSendNotification(HttpWorkerRequest.EndOfSendNotification callback, object extraData);
// 摘要:
// 表示用于在完成发送响应后通知调用方的方法。
//
// 参数:
// wr:
// 当前的 System.Web.HttpWorkerRequest。
//
// extraData:
// 处理请求所需的任何其他数据。
public delegate void EndOfSendNotification(HttpWorkerRequest wr, object extraData);
}