标签:nec stp connect false sub task 选项 ted requests
原文 http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps
简单来说,就是在UWP中做一个简单的Web Server,本实例UWP(server) 与 Winform(client) 在同一机子将无法通讯,但UWP(server)写client代码可调用调试。
注意,Package.appxmanifest 选项“功能”卡中的Internet配置。
Below is some code for a simple HTTP server for Metro/Modern-style Windows 8 apps. This code supports GET requests for a resource located at the root-level (e.g. http://localhost:8000/foo.txt
) and looks for the corresponding file in the Data
directory of the app package. This might be useful for unit testing, among other things.
public class HttpServer : IDisposable { private const uint BufferSize = 8192; private static readonly StorageFolder LocalFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; private readonly StreamSocketListener listener; public HttpServer(int port) { this.listener = new StreamSocketListener(); this.listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket); this.listener.BindServiceNameAsync(port.ToString()); } public void Dispose() { this.listener.Dispose(); } private async void ProcessRequestAsync(StreamSocket socket) { // this works for text only StringBuilder request = new StringBuilder(); using(IInputStream input = socket.InputStream) { byte[] data = new byte[BufferSize]; IBuffer buffer = data.AsBuffer(); uint dataRead = BufferSize; while (dataRead == BufferSize) { await input.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial); request.Append(Encoding.UTF8.GetString(data, 0, data.Length)); dataRead = buffer.Length; } } using (IOutputStream output = socket.OutputStream) { string requestMethod = request.ToString().Split(‘\n‘)[0]; string[] requestParts = requestMethod.Split(‘ ‘); if (requestParts[0] == "GET") await WriteResponseAsync(requestParts[1], output); else throw new InvalidDataException("HTTP method not supported: " + requestParts[0]); } } private async Task WriteResponseAsync(string path, IOutputStream os) { using (Stream resp = os.AsStreamForWrite()) { bool exists = true; try { // Look in the Data subdirectory of the app package string filePath = "Data" + path.Replace(‘/‘, ‘\\‘); using (Stream fs = await LocalFolder.OpenStreamForReadAsync(filePath)) { string header = String.Format("HTTP/1.1 200 OK\r\n" + "Content-Length: {0}\r\n" + "Connection: close\r\n\r\n", fs.Length); byte[] headerArray = Encoding.UTF8.GetBytes(header); await resp.WriteAsync(headerArray, 0, headerArray.Length); await fs.CopyToAsync(resp); } } catch (FileNotFoundException) { exists = false; } if (!exists) { byte[] headerArray = Encoding.UTF8.GetBytes( "HTTP/1.1 404 Not Found\r\n" + "Content-Length:0\r\n" + "Connection: close\r\n\r\n"); await resp.WriteAsync(headerArray, 0, headerArray.Length); } await resp.FlushAsync(); } } }
Usage:
const int port = 8000; using (HttpServer server = new HttpServer(port)) { using (HttpClient client = new HttpClient()) { try { byte[] data = await client.GetByteArrayAsync( "http://localhost:" + port + "/foo.txt"); // do something with } catch (HttpRequestException) { // possibly a 404 } } }
Notes:
CheckNetIsolation.exe
to do this. This is useful for debugging only, as it must be done manually.BackgroundDownloader
appears to fall into this category even though that is an API available to Metro apps.A simple in-process HTTP server for UWP
标签:nec stp connect false sub task 选项 ted requests
原文地址:http://www.cnblogs.com/lonelyxmas/p/7599766.html