C# 创建精简版IIS
1. 方法 一
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net;
using System.IO; namespace SampleIIS
{
// Sample IIS class
class SampleIIS
{
public void StartIIS()
{
string url = "http://localhost:8080/";
string vm_ID = string.Empty;
HttpListener httpListener = new HttpListener(); httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
httpListener.Prefixes.Add(url); // 1. Start Server
System.Console.WriteLine("[{1}] [system] Start Server, Port {0} \r\n", url, DateTime.Now.ToLongTimeString()); httpListener.Start();
new Thread(new ThreadStart(delegate
{
while (true)
{
// 2. Wating commad
System.Console.WriteLine("[{0}] [system] Wating commad ..... \r\n ", DateTime.Now.ToLongTimeString()); HttpListenerContext httpListenerContext = httpListener.GetContext(); // 3. Receive request/ do something/ create VM // ceate VM and get vm_ID
vm_ID = string.Format("VM_ID:XiaoChen-123456-{0}-{1}", DateTime.Now.ToString("yyyyMMddhhmmss"), DateTime.Now.Millisecond);
System.Console.WriteLine("[{0}] [Remote] Receive request. ", DateTime.Now.ToLongTimeString());
System.Console.WriteLine("[{0}] [Remote] Receive privillige, working...", DateTime.Now.ToLongTimeString());
System.Console.WriteLine("[{0}] [Remote] {1} create successfully !", DateTime.Now.ToLongTimeString(), vm_ID); // 4. Respone header / contents
httpListenerContext.Response.StatusCode = ;
httpListenerContext.Response.Headers.Add(vm_ID); // Header, Key-Value 随意加
httpListenerContext.Response.ContentType = "text/plain"; using (StreamWriter writer = new StreamWriter(httpListenerContext.Response.OutputStream))
{
// response as xml
writer.WriteLine("<?xml version=\"1.0\">");
writer.WriteLine("<niaoyun>");
writer.WriteLine(" <result>{0}</result>", vm_ID);
writer.WriteLine(" <message>Success</message>");
writer.WriteLine(" <version>V1.0</version>");
writer.WriteLine(" <time>{0}</time>", DateTime.Now.ToString("yyyyMMddhhmmss"));
writer.WriteLine("</niaoyun>");
} // 5. Ending
System.Console.WriteLine("[{0}] [Remote] Completed!\r\n ", DateTime.Now.ToLongTimeString());
}
})).Start();
}
} class Program
{
static void Main(string[] args)
{
SampleIIS siis = new SampleIIS();
siis.StartIIS();
}
}
}
2.方法二:
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace Bend.Util { public class HttpProcessor {
public TcpClient socket;
public HttpServer srv; private Stream inputStream;
public StreamWriter outputStream; public String http_method;
public String http_url;
public String http_protocol_versionstring;
public Hashtable httpHeaders = new Hashtable(); private static int MAX_POST_SIZE = * * ; // 10MB public HttpProcessor(TcpClient s, HttpServer srv) {
this.socket = s;
this.srv = srv;
} private string streamReadLine(Stream inputStream) {
int next_char;
string data = "";
while (true) {
next_char = inputStream.ReadByte();
if (next_char == '\n') { break; }
if (next_char == '\r') { continue; }
if (next_char == -) { Thread.Sleep(); continue; };
data += Convert.ToChar(next_char);
}
return data;
}
public void process() {
// we can't use a StreamReader for input, because it buffers up extra data on us inside it's
// "processed" view of the world, and we want the data raw after the headers
inputStream = new BufferedStream(socket.GetStream()); // we probably shouldn't be using a streamwriter for all output from handlers either
outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
try {
parseRequest();
readHeaders();
if (http_method.Equals("GET")) {
handleGETRequest();
} else if (http_method.Equals("POST")) {
handlePOSTRequest();
}
} catch (Exception e) {
Console.WriteLine("Exception: " + e.ToString());
writeFailure();
}
outputStream.Flush();
// bs.Flush(); // flush any remaining output
inputStream = null; outputStream = null; // bs = null;
socket.Close();
} public void parseRequest() {
String request = streamReadLine(inputStream);
string[] tokens = request.Split(' ');
if (tokens.Length != ) {
throw new Exception("invalid http request line");
}
http_method = tokens[].ToUpper();
http_url = tokens[];
http_protocol_versionstring = tokens[]; Console.WriteLine("starting: " + request);
} public void readHeaders() {
Console.WriteLine("readHeaders()");
String line;
while ((line = streamReadLine(inputStream)) != null) {
if (line.Equals("")) {
Console.WriteLine("got headers");
return;
} int separator = line.IndexOf(':');
if (separator == -) {
throw new Exception("invalid http header line: " + line);
}
String name = line.Substring(, separator);
int pos = separator + ;
while ((pos < line.Length) && (line[pos] == ' ')) {
pos++; // strip any spaces
} string value = line.Substring(pos, line.Length - pos);
Console.WriteLine("header: {0}:{1}",name,value);
httpHeaders[name] = value;
}
} public void handleGETRequest() {
srv.handleGETRequest(this);
} private const int BUF_SIZE = ;
public void handlePOSTRequest() {
// this post data processing just reads everything into a memory stream.
// this is fine for smallish things, but for large stuff we should really
// hand an input stream to the request processor. However, the input stream
// we hand him needs to let him see the "end of the stream" at this content
// length, because otherwise he won't know when he's seen it all! Console.WriteLine("get post data start");
int content_len = ;
MemoryStream ms = new MemoryStream();
if (this.httpHeaders.ContainsKey("Content-Length")) {
content_len = Convert.ToInt32(this.httpHeaders["Content-Length"]);
if (content_len > MAX_POST_SIZE) {
throw new Exception(
String.Format("POST Content-Length({0}) too big for this simple server",
content_len));
}
byte[] buf = new byte[BUF_SIZE];
int to_read = content_len;
while (to_read > ) {
Console.WriteLine("starting Read, to_read={0}",to_read); int numread = this.inputStream.Read(buf, , Math.Min(BUF_SIZE, to_read));
Console.WriteLine("read finished, numread={0}", numread);
if (numread == ) {
if (to_read == ) {
break;
} else {
throw new Exception("client disconnected during post");
}
}
to_read -= numread;
ms.Write(buf, , numread);
}
ms.Seek(, SeekOrigin.Begin);
}
Console.WriteLine("get post data end");
srv.handlePOSTRequest(this, new StreamReader(ms)); } public void writeSuccess() {
outputStream.WriteLine("HTTP/1.0 200 OK");
outputStream.WriteLine("Content-Type: text/html");
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
} public void writeFailure() {
outputStream.WriteLine("HTTP/1.0 404 File not found");
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
}
} public abstract class HttpServer { protected int port;
TcpListener listener;
bool is_active = true; public HttpServer(int port) {
this.port = port;
} public void listen() {
listener = new TcpListener(port);
listener.Start();
while (is_active) {
TcpClient s = listener.AcceptTcpClient();
HttpProcessor processor = new HttpProcessor(s, this);
Thread thread = new Thread(new ThreadStart(processor.process));
thread.Start();
Thread.Sleep();
}
} public abstract void handleGETRequest(HttpProcessor p);
public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData);
} public class MyHttpServer : HttpServer { public string vm_ID; public MyHttpServer(int port)
: base(port) {
}
public override void handleGETRequest(HttpProcessor p) {
Console.WriteLine("request: {0} \r\n ", p.http_url); p.writeSuccess();
p.outputStream.WriteLine("\r\n <html><body><h1>test server</h1>");
p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
p.outputStream.WriteLine("url : {0}", p.http_url); p.outputStream.WriteLine("<form method=post action=/form>");
p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
p.outputStream.WriteLine("</form>");
} public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData) {
Console.WriteLine("POST request: {0}", p.http_url);
string data = inputData.ReadToEnd();
vm_ID = string.Format("VM_ID:XiaoChen-123456-{0}-{1}", DateTime.Now.ToString("yyyyMMddhhmmss"), DateTime.Now.Millisecond); // response as xml
p.outputStream.WriteLine("<?xml version=\"1.0\">");
p.outputStream.WriteLine("<niaoyun>");
p.outputStream.WriteLine(" <result>{0}</result>", vm_ID);
p.outputStream.WriteLine(" <message>Success</message>");
p.outputStream.WriteLine(" <version>V1.0</version>");
p.outputStream.WriteLine(" <time>{0}</time>", DateTime.Now.ToString("yyyyMMddhhmmss"));
p.outputStream.WriteLine(" <postbody>{0}</postbody>", data);
p.outputStream.WriteLine("</niaoyun>");
}
} public class TestMain {
public static int Main(String[] args) {
HttpServer httpServer;
if (args.GetLength() > ) {
httpServer = new MyHttpServer(Convert.ToInt16(args[]));
} else {
httpServer = new MyHttpServer();
}
Thread thread = new Thread(new ThreadStart(httpServer.listen));
thread.Start();
return ;
} } }
C# 创建精简版IIS的更多相关文章
- DeepinXP Lite 6.2 精简版220M 安装IIS
本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 用虚拟机装了DEEP ...
- Log4j快速使用精简版
Log4j快速使用精简版 1.导入log4j-1.2.17.jar包 2.在src根目录下创建log4j.properties文件 log4j.rootLogger=INFO, CONSOLE, FI ...
- Vue精简版风格指南
前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...
- Python_实现json数据的jsonPath(精简版)定位及增删改操作
基于python实现json数据的jsonPath(精简版)定位及增删改操作 by:授客 QQ:1033553122 实践环境 win7 64 Python 3.4.0 代码 #-*- encod ...
- 虚拟机安装精简版centos7过程
虚拟机配置工作如下所示 1.创建虚拟机 使用键盘组合键CTRL+N2.选择自定义(高级) 如图所示: 3.默认如何所示: 4.选择 稍后安装操作系统 如图所示: 5.选择对应的操作系统 如何所示 6 ...
- 03-Spring profile实用精简版介绍
为什么说是实用精简版,没办法,工作太忙压力大啊,菜是原罪啊,所以接下来写的一些博客可能都是更偏实用性,精简点,方便自己回顾,快速上手使用即可,毕竟感觉不详细还有书不是吗. profile是用来干什么的 ...
- WIN10X64LTSC2019中度精简版by双心
WIN10X64LTSC2019中度精简版by双心https://www.cnblogs.com/liuzhaoyzz/p/11295032.html 一.前言:关于LTSC中度精简版的说明 一个MM ...
- Linux上oracle精简版客户端快速部署
RHEL6 + Oracle 11g客户端快速部署 需求:只是用到客户端的sqlplus, sqlldr功能. 方案:用精简版实现客户端的快速部署 1.上传oracle精简版客户端到服务器/tmp目录 ...
- ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址
原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...
随机推荐
- PHP 在 Mac 的安装之路
半年前本以为有一些 Apache 和 PHP 的安装经验,今天在 Mac 上还是踩了很多坑. 坦诚地讲,这东西入门成本比 Node,Python 入门成本真的是大很多. Apache 的编译安装就是那 ...
- NumPy Ndarray 对象
NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...
- 【收藏】UI自动化测试基本规则与设计模式
总体规则 所有模块设计均遵循page object结构 用例层:测试人员编写测试用例代码的地方,可以调用page层和封装层. page层:一个页面一个类,包含该页面的业务逻辑封装以及部分控件定义. 封 ...
- Codeforces Beta Round #63 (Div. 2)
Codeforces Beta Round #63 (Div. 2) http://codeforces.com/contest/69 A #include<bits/stdc++.h> ...
- RocketMq顺序消费
部分内容出处 https://www.jianshu.com/p/453c6e7ff81c rocketmq内部有4个默认的队里,在发送消息时,同一组的消息需要按照顺序,发送到相应的mq中,同一组 ...
- 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密
后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...
- ngular ionic select ng-options 默认选择第一个值的写法
1. html <select ng-model="selectOrderState" style="border:none;left:0" ng-opt ...
- f5电源模块损坏
现象: ssh登录f5后有日志显示 现场确认f5 2槽电源指示灯不亮,且电源线正常.重新开关电源模块,拔插电源线后仍不亮.故确认是电源模块损坏. 处理:直接采购新的电源模块更换即可.f5电源支持热插拔 ...
- windows 2012安装不了KB2919355
直接安装KB2919355会报错 “此更新不适用于你的计算机” 此时应先安装 KB2919442 https://www.microsoft.com/zh-cn/download/confirmati ...
- LAB3 整数相加
//yuec2 Yue Cheng package lab3; public class Fraction { int numerator; int denominator; //obeject wi ...