C#⽹络编程⼊门之HTTP
⼀、概述
本⽂⽬的是通过C#代码提供⼀个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应⽤程序或Windows服务需要向外提供⼀些简单的HTTP服务就可以⾃⼰实现,从⽽避免部署IIS增加系统复杂性。这⾥必须强调是⼀些简单的应⽤,如果应⽤⽐较复杂,涉及到路径解析HTML解析等,还是⽤WEB⽅式实现⽐较靠谱。
将HTTP和UDP、TCP放在同⼀个系列实际上有⼀点不合适,因为UDP、TCP属于传输层协议,HTTP属于应⽤层协议,希望读者⾸先有⼀个明确的了解。
⼆、提供服务
⾸先启动HHTP服务:
if (!HttpListener.IsSupported)
{
Console.WriteLine("服务器操作系统不⽀持建⽴Http Server,需要更⾼版本的操作系统!");
return;
}
HttpListener httpListener = new HttpListener();
try
{
Console.WriteLine("正在启动Http服务");
int port = 9000;
httpListener.Prefixes.Add($"*:{port}/");
httpListener.Start();
Console.WriteLine("Http服务启动成功。");
}
catch (Exception ex)
{
Console.WriteLine($"启动Http服务出现异常:{ex.Message}");
return;
}
进⾏监听:
while (true)
{
Console.WriteLine("开始监听...");
HttpListenerContext context = httpListener.GetContext();
HttpListenerRequest request = context.Request;
string Method = request.HttpMethod.ToUpper();
Console.WriteLine($"收到请求,URL:{ request.Url} Method:{Method}");
Response(context, "hello");
}
代码循环进⾏监听,GetContext⽅法会引起阻塞,当收到浏览器请求时,服务器⽴即返回“Hello”。
Response⽅法实现如下:
private static void Response(HttpListenerContext context, string responseTxt)
{
HttpListenerResponse response = context.Response;
response.ContentType = "html";
response.ContentEncoding = Encoding.UTF8;
using (Stream output = response.OutputStream)
{
byte[] buffer2 = Encoding.UTF8.GetBytes(responseTxt);
output.Write(buffer2, 0, buffer2.Length);
}
}
此时打开浏览器输⼊地址 localhosthost:9000/ 看⼀下能否看到结果。(如果需要通过其他机器访问,本机要开放防⽕墙对应端⼝。)注意:程序需要以管理员模型运⾏才能提供服务。
具体办法:⼯程新增应⽤程序清单⽂件:app.manifest,修改配置信息如下:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
三、响应
通过request.HttpMethod可以取得协议类型,对于GET和POST⽅法将采取不同的处理⽅式。
通过request.RawUrl可以取得URL路径,并进⾏解析,通过request.QueryString可以⽤户输⼊的参数值。
if (Method == "GET")
{
Console.WriteLine($"Get:RawURL:{ request.RawUrl}");
if (request.RawUrl.StartsWith("/version"))
{
Response(context, "Simple Http Server Ver:0.11");
continue;
}
else
{
string username = request.QueryString["username"];
string pwd = request.QueryString["pwd"];
Response(context, $"Welcome:{username}");
continue;
}
}
以上代码,如果输⼊:localhost:9000?username=hahaha
输出:Welcome:hahaha
在POST⽅法下,仍然可以通过request.QueryString取得⽤户通过URL输⼊的参数,但通过Body传输的数据需要通过其他⽅式进⾏读取。
if (Method == "POST")
{
Console.WriteLine($"POST:RawURL:{ request.RawUrl}");
网络编程之delphistring content = GetPostInput(request);
Console.WriteLine($"Content:{ content}");
Response(context, "\"{'Result':'Success','Message':'Hello'}\"");
continue;
}
GetPostInput⽅法实现如下:
private static string GetPostInput(HttpListenerRequest request)
{
Stream s = request.InputStream;
int count = 0;
byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, 0, 1024)) > 0)
{
builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
}
s.Flush();
s.Close();
s.Dispose();
return builder.ToString();
}
为了⽅便起见,输⼊输出的数据最好采⽤json格式。
四、调试
可以通过Chrome或Postman来进⾏调试。
传送门:
C#⽹络编程⼊门系列包括三篇⽂章:(⼀)
(⼆)
(三)C#⽹络编程⼊门之HTTP
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论