简体   繁体   中英

How do I get httprequest content to display on localhost in c#?

I have an incoming POST request from a program that consists of JSON data.

This is my server code:

static HttpListener _httpListener = new HttpListener();

        static void ResponseThread()
        {
            while (true)
            {
                HttpListenerContext context = _httpListener.GetContext(); // get a context
                                                                          // Now, you'll find the request URL in context.Request.Url
                HttpListenerRequest request = context.Request;
                string test = "";
                using (http://System.IO (http://System.IO).Stream body = request.InputStream) // here we have data 
                {
                    using (http://System.IO (http://System.IO).StreamReader reader = new http://System.IO (http://System.IO).StreamReader(body, request.ContentEncoding)) 
                    {
                        test = reader.ReadToEnd();
                    }
                }
                Console.WriteLine(test);
                byte[] _responseArray = Encoding.UTF8.GetBytes(test); // get the bytes to response
                context.Response.OutputStream.Write(_responseArray, 0, _responseArray.Length); // write bytes to the output stream
                context.Response.KeepAlive = false; // set the KeepAlive bool to false
                context.Response.Close(); // close the connection
                Console.WriteLine("Respone given to a request.");
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Starting server...");
            _httpListener.Prefixes.Add("http://localhost:5000/ (http://localhost:5000/)"); // add prefix "http://localhost:5000/ (http://localhost:5000/)" 
            _httpListener.Start(); // start server (Run application as Administrator!)
            Console.WriteLine("Server started.");
            Thread _responseThread = new Thread(ResponseThread);
            _responseThread.Start(); // start the response thread
        }

This is the posting code i'm using outside of the server code in a different project

static string httpPost(string json)
        {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:5000/");
            httpWebRequest.ContentType = "text/json";
            httpWebRequest.Method = "POST";

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                return result;
            }
        }

and I want to display the "test" variable in my browser but for right now it isn't working at all. Nothing is displayed but if I just send some html it works. Is there anyway to get this working or parse it out so that it does work?

To augment my comment on your question, here's a "Hello World" of sorts using the Owin self hosted server. It mimics what your question was trying to do. First install NuGet package Microsoft.Owin.SelfHost . Then include the System.Net.Http and System.Net.Http.Formatting .Net framework references. Included also is a code example to call the self-hosted server.

using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace StackOverflowAnswer
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use<RespondToRequestMiddleware>();
        }
    }

    class RespondToRequestMiddleware : OwinMiddleware
    {
        public RespondToRequestMiddleware(OwinMiddleware next)
            : base(next)
        {

        }

        public async override Task Invoke(IOwinContext context)
        {
            // Perform request stuff...
            // Could verify that the request Content-Type == application/json
            // Could verify that the request method was POST.
            bool isPost = context.Request.Method == "POST";
            string test = null;
            if (isPost)
            {
                using (StreamReader reader = new StreamReader(context.Request.Body))
                {
                    test = await reader.ReadToEndAsync();
                }
            }

            await Next.Invoke(context); // pass off request to the next middleware

            if (isPost)
            {
                // Perform response stuff...
                context.Response.ContentType = "application/json";
                context.Response.StatusCode = 200;
                await context.Response.WriteAsync(test);
                Console.WriteLine("Response given to a request.");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://localhost:5000/";
            using (WebApp.Start<Startup>(url))
            {
                Console.WriteLine($"Listening on {url}...");

                using (HttpClient httpClient = new HttpClient())
                {
                    string json = "{\"key\":\"value\", \"otherKey\":\"secondValue\"}";
                    // Typically use the extensions in System.Net.Http.Formatting in order to post a strongly typed object with HttpClient.PostAsJsonAsync<T>(url)
                    StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
                    HttpResponseMessage response = httpClient.PostAsync(url, content).Result; // IMPORTANT: use await in an async method in the real world.

                    if (response.IsSuccessStatusCode)
                    {
                        string responseJson = response.Content.ReadAsStringAsync().Result; // Again: use await in an async method in the real world.
                        Console.WriteLine(responseJson); // In your method, return the string.
                    }
                    else
                    {
                        Console.WriteLine($"Unsuccessful {response.StatusCode} : {response.ReasonPhrase}");
                    }
                }

                Console.ReadLine(); // keep console from closing so server can keep listening.
            }
        }
    }
}

In action: 在此处输入图片说明

Check out the Microsoft Owin/Katana site for more info.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM