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的更多相关文章

  1. DeepinXP Lite 6.2 精简版220M 安装IIS

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 用虚拟机装了DEEP ...

  2. Log4j快速使用精简版

    Log4j快速使用精简版 1.导入log4j-1.2.17.jar包 2.在src根目录下创建log4j.properties文件 log4j.rootLogger=INFO, CONSOLE, FI ...

  3. Vue精简版风格指南

    前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...

  4. Python_实现json数据的jsonPath(精简版)定位及增删改操作

    基于python实现json数据的jsonPath(精简版)定位及增删改操作   by:授客 QQ:1033553122 实践环境 win7 64 Python 3.4.0 代码 #-*- encod ...

  5. 虚拟机安装精简版centos7过程

    虚拟机配置工作如下所示 1.创建虚拟机  使用键盘组合键CTRL+N2.选择自定义(高级) 如图所示: 3.默认如何所示: 4.选择 稍后安装操作系统 如图所示: 5.选择对应的操作系统 如何所示 6 ...

  6. 03-Spring profile实用精简版介绍

    为什么说是实用精简版,没办法,工作太忙压力大啊,菜是原罪啊,所以接下来写的一些博客可能都是更偏实用性,精简点,方便自己回顾,快速上手使用即可,毕竟感觉不详细还有书不是吗. profile是用来干什么的 ...

  7. WIN10X64LTSC2019中度精简版by双心

    WIN10X64LTSC2019中度精简版by双心https://www.cnblogs.com/liuzhaoyzz/p/11295032.html 一.前言:关于LTSC中度精简版的说明 一个MM ...

  8. Linux上oracle精简版客户端快速部署

    RHEL6 + Oracle 11g客户端快速部署 需求:只是用到客户端的sqlplus, sqlldr功能. 方案:用精简版实现客户端的快速部署 1.上传oracle精简版客户端到服务器/tmp目录 ...

  9. ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址

    原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...

随机推荐

  1. day24 面向对象三大特性之封装

    本周内容 组合 封装 多态 面向对象高级 异常处理 网络协议 通讯原理 互联网协议 TCP/UDP 基于TCP协议的套接字 上周回顾 1.xml,os,os.path 2.ATM+购物车 三层结构 3 ...

  2. Numpy:ndarray数据类型和运算

    Numpy的ndarray:一种多维数组对象 N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个 ...

  3. Android 设置EditText光标位置(转)

    Android 设置EditText光标位置 最后 CharSequence text = edtTxt_my_account_edit_nickname.getText();if (text ins ...

  4. ubuntu后台运行命令

    参考 https://blog.csdn.net/shaozg168/article/details/6979337 nohup ./test.sh &

  5. CentOS 删除文件的常用命令

    NO1. 删除当前目录的文件[root@rehat root]# rm test.txt NO2. 强制删除当前目录的文件,不弹出提示[root@rehat root]# rm -f test.txt ...

  6. Python os.getcwd()

    Python os.getcwd() 方法  Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...

  7. TOJ3448: 小学生的作业

    Python字符串的插入操作 传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3448 ...

  8. Python+Selenium学习--访问连接

    场景 web UI测试里最简单也是最基本的事情就是访问1个链接了. 在python的webdrive中,访问url时应该使用get方法. 代码 #!/usr/bin/env python # -*- ...

  9. ORACLE的强制索引

    在一些场景下,可能ORACLE不会自动走索引,这时候,如果对业务清晰,可以尝试使用强制索引,测试查询语句的性能. 以EMP表为例: 先在EMP表中建立唯一索引,如图. 普通搜索: SELECT * F ...

  10. 填坑专记-手脱FSG壳

      妈呀,脱FGS壳真的是坎坷颇多,多亏吾爱破解前辈们的帮忙.我一定要记录下来,省的以后再无法解决.   已经查看是FSG壳了.找到入口也容易了.重点就是脱壳并修复好它. 脱壳   OEP为:   使 ...