HttpListener 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供一个简单的以编程方式控制的 HTTP 协议侦听器。 此类不能被继承。 HttpListener不建议将类型用于新开发;有关详细信息,请参阅“备注”部分。
public ref class HttpListener sealed : IDisposable
public sealed class HttpListener : IDisposable
type HttpListener = class
interface IDisposable
Public NotInheritable Class HttpListener
Implements IDisposable
- 继承
-
HttpListener
- 实现
示例
// This example requires the System and System.Net namespaces.
public static void SimpleListenerExample(string[] prefixes)
{
if (!HttpListener.IsSupported)
{
Console.WriteLine ("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
return;
}
// URI prefixes are required,
// for example "http://contoso.com:8080/index/".
if (prefixes == null || prefixes.Length == 0)
throw new ArgumentException("prefixes");
// Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("Listening...");
// Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
listener.Stop();
}
Public Shared Sub SimpleListenerExample(prefixes As String())
If Not HttpListener.IsSupported Then
Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.")
Return
End If
' URI prefixes are required,
' for example "http://contoso.com:8080/index/".
If prefixes Is Nothing Or prefixes.Length = 0 Then
Throw New ArgumentException("prefixes")
End If
' Create a listener
Dim listener = New HttpListener()
For Each s As String In prefixes
listener.Prefixes.Add(s)
Next
listener.Start()
Console.WriteLine("Listening...")
' Note: The GetContext method blocks while waiting for a request.
Dim context As HttpListenerContext = listener.GetContext()
Console.WriteLine("Listening...")
' Obtain a response object
Dim request As HttpListenerRequest = context.Request
' Construct a response.
Dim response As HttpListenerResponse = context.Response
Dim responseString As String = "<HTML><BODY> Hello world!</BODY></HTML>"
Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(responseString)
' Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length
Dim output As System.IO.Stream = response.OutputStream
output.Write(buffer, 0, buffer.Length)
'You must close the output stream.
output.Close()
listener.Stop()
End Sub
注解
Caution
建议不要将HttpListener类用于新开发。
HttpListener 仅接收有限的服务,并且其行为和协议支持因每个平台使用不同的基础实现而有所不同。 例如,在Windows它构建HTTP.sys在 Linux 和 macOS 上时,它使用不支持 HTTPS 的托管实现并提供更窄的功能集。 请改用 ASP.NET Core,它提供完全支持的跨平台和高性能 HTTP 服务器。
使用此类 HttpListener ,可以创建一个简单的 HTTP 协议侦听器来响应 HTTP 请求。 侦听器在 HttpListener 对象的生存期内处于活动状态,并依赖其权限在应用程序中运行。
若要使用 HttpListener,请使用 HttpListener 构造函数创建类的新实例,并使用 Prefixes 属性获取对包含指定应处理的统一资源标识符(URI)前缀 HttpListener 的字符串的集合的访问权限。
URI 前缀字符串由方案(http 或 https)、主机、可选端口和可选路径组成。 完整的前缀字符串的一个示例是 http://www.contoso.com:8080/customerData/。 前缀必须以正斜杠(“/”)结尾。
HttpListener与请求的 URI 最匹配的前缀的对象响应请求。 多个 HttpListener 对象无法添加相同的前缀; Win32Exception 如果 HttpListener 添加已使用的前缀,则会引发异常。
指定端口时,主机元素可以替换为“*”,以指示 HttpListener 如果请求的 URI 与任何其他前缀不匹配,则接受发送到端口的请求。 例如,若要在请求的 URI 未由任何 HttpListener处理时接收发送到端口 8080 的所有请求,前缀为 http://*:8080/。 同样,若要指定 HttpListener 接受发送到端口的所有请求,请将主机元素替换为“+”字符。 例如,https://+:8080。 “*”和“+”字符可以出现在包含路径的前缀中。
在由 HttpListener 对象管理的 URI 前缀中支持通配符子域。 若要指定通配符子域,请使用“*”字符作为 URI 前缀中主机名的一部分。 例如 ,http://*.foo.com/。 将此作为参数传递给Add方法。
Warning
不应使用顶级通配符绑定(http://+:8080和)。 顶级通配符绑定可能会为应用带来安全漏洞。 此行为同时适用于强通配符和弱通配符。 使用显式主机名而不是通配符。 如果可控制整个父域(区别于易受攻击的 *.mysub.com),则子域通配符绑定(例如,*.com)不具有此安全风险。 有关详细信息,请参阅 rfc7230 section-5.4 。
若要开始侦听来自客户端的请求,请将 URI 前缀添加到集合并调用 Start 该方法。 HttpListener 提供用于处理客户端请求的同步模型和异步模型。 使用HttpListenerContext方法或其异步对应的GetContext和BeginGetContext方法返回的EndGetContext对象来访问请求及其关联的响应。
如果您的应用程序在等待客户端请求时需要阻塞,并且只想一次处理一个请求,那么同步模型是合适的。 使用同步模型调用 GetContext 该方法,该方法等待客户端发送请求。 此方法将在事件发生时返回一个 HttpListenerContext 对象以供处理。
在更复杂的异步模型中,应用程序在等待请求时不会阻止,并且每个请求都在其自己的执行线程中进行处理。 使用该方法 BeginGetContext 指定要为每个传入请求调用的应用程序定义方法。 在该方法中,调用 EndGetContext 该方法以获取请求、处理请求和响应。
在任一模型中,传入的请求都使用 HttpListenerContext.Request 属性进行访问,并由对象表示 HttpListenerRequest 。 同样,可以使用 HttpListenerContext.Response 属性访问响应,它们由 HttpListenerResponse 对象表示。 这些对象与HttpWebRequest和HttpWebResponse对象共享一些功能,但由于它们实现的是客户端行为,而不是服务器行为,因此这后者不能与HttpListener一起使用。
HttpListener 可以要求客户端身份验证。 可以指定用于身份验证的特定方案,或者指定一个决定要使用哪个方案的委托。 必须要求某种形式的身份验证才能获取有关客户端标识的信息。 有关其他信息,请参阅属性UserAuthenticationSchemes和AuthenticationSchemeSelectorDelegate属性。
注释
如果使用 https 创建 HttpListener ,则必须为该侦听器选择服务器证书。 否则,对此 HttpListener 的请求将失败,导致连接意外关闭。
注释
可以使用 Network Shell 配置服务器证书和其他侦听器选项(netsh.exe)。 有关更多详细信息 ,请参阅 Network Shell(Netsh )。 可执行文件开始随 Windows Server 2008 和 Windows Vista 一起交付。
注释
如果为客户端 HttpListener指定了多个身份验证方案,侦听器将按以下顺序对客户端进行质询: Negotiate、 NTLM、 Digest,然后 Basic。
HTTP.sys
该 HttpListener 类基于 HTTP.sys该类构建,它是处理 Windows 所有 HTTP 流量的内核模式侦听器。
HTTP.sys 提供连接管理、带宽限制和 Web 服务器日志记录。
使用 HttpCfg.exe 工具添加 SSL 证书。
从 .NET 11 开始,Windows HTTP.sysHttpListener 的实现支持启用内核级响应缓冲。 启用后,响应数据会先缓冲 HTTP.sys ,然后再发送到客户端,从而提高高延迟连接的吞吐量。 可以通过调用 AppContext.SetSwitch 方法来启用此操作,如下所示:
AppContext.SetSwitch("System.Net.HttpListener.EnableKernelResponseBuffering", true);
构造函数
| 名称 | 说明 |
|---|---|
| HttpListener() |
初始化 HttpListener 类的新实例。 HttpListener不建议将类型用于新开发;有关详细信息,请参阅“备注”部分。 |
属性
| 名称 | 说明 |
|---|---|
| AuthenticationSchemes |
获取或设置用于对客户端进行身份验证的方案。 |
| AuthenticationSchemeSelectorDelegate |
获取或设置调用的委托,以确定用于对客户端进行身份验证的协议。 |
| DefaultServiceNames |
获取由已注册前缀确定的服务提供程序名称(SPN)的默认列表。 |
| ExtendedProtectionPolicy |
获取或设置 ExtendedProtectionPolicy 用于会话的扩展保护。 |
| ExtendedProtectionSelectorDelegate |
获取或设置调用的委托,以确定 ExtendedProtectionPolicy 要用于每个请求。 |
| IgnoreWriteExceptions |
获取或设置一个 Boolean 值,该值指定应用程序是否收到在向客户端发送响应时 HttpListener 发生的异常。 |
| IsListening |
获取一个值,该值指示是否已 HttpListener 启动。 |
| IsSupported |
获取一个值,该值指示是否可以 HttpListener 与当前操作系统一起使用。 |
| Prefixes |
获取此 HttpListener 对象处理的统一资源标识符(URI)前缀。 |
| Realm |
获取或设置与此 HttpListener 对象关联的领域或资源分区。 |
| TimeoutManager |
此 HttpListener 实例的超时管理器。 |
| UnsafeConnectionNtlmAuthentication |
获取或设置一个值,该值控制是否在使用 NTLM 时,需要使用同一 Boolean 传输控制协议(TCP)连接的其他请求进行身份验证。 |
方法
| 名称 | 说明 |
|---|---|
| Abort() |
立即关闭 HttpListener 对象,丢弃所有当前排队的请求。 |
| BeginGetContext(AsyncCallback, Object) |
开始异步检索传入请求。 |
| Close() |
HttpListener关闭 . |
| EndGetContext(IAsyncResult) |
完成异步操作以检索传入的客户端请求。 |
| Equals(Object) |
确定指定的对象是否等于当前对象。 (继承自 Object) |
| GetContext() |
等待传入请求,并在收到一个请求时返回。 |
| GetContextAsync() |
等待传入请求作为异步操作。 |
| GetHashCode() |
用作默认哈希函数。 (继承自 Object) |
| GetType() |
获取当前实例的 Type。 (继承自 Object) |
| MemberwiseClone() |
创建当前 Object的浅表副本。 (继承自 Object) |
| Start() |
允许此实例接收传入的请求。 |
| Stop() |
导致此实例停止接收新的传入请求并终止处理所有正在进行的请求。 |
| ToString() |
返回一个表示当前对象的字符串。 (继承自 Object) |
显式接口实现
| 名称 | 说明 |
|---|---|
| IDisposable.Dispose() |
释放此 HttpListener 对象持有的资源。 |