skip to Main Content

I’m facing with problem about creating HTTP server which has API on his side and also is able to listen all calls and log it.
I want to create something like:
Hub – server responsible for handle my window services which will registered, also communication logging between hub and nodes.
Nodes – window services which working as Client, which executing some tasks and using Hub API are able to logging information about that.

I dont know it is possible to create HTTP server which include API and HTTPListener. I tried like that, but this wont work.

Example:

static void Main(string[] args)
    {
        var httpServer = new HttpServer();

        httpServer.Start(); //Listener using address - http://localhost:8080 the same as SelfHostServer

        Console.WriteLine("Starting HTTP listener...");

        var config = new HttpSelfHostConfiguration("http://localhost:8080/");

        config.Routes.MapHttpRoute(
            "API Default", 
            "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

        using (HttpSelfHostServer server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();
            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }

        while (Program._keepRunning) { }

        httpServer.Stop();

        Console.WriteLine("Exiting gracefully...");
    }

Im not sure Im going good way, maybe I should create a separate server to listen and a separate selfhost server for the API?
Can someone explain what should I do for achive this? Thanks

EDIT

I want to avoid this:
enter image description here

2

Answers


  1. Chosen as BEST ANSWER

    I was looking for middleware - https://learn.microsoft.com/pl-pl/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0

    Selfthost API server and HttpListener server was not needed. All my web api calls will be catch and I can log all communications:

    app.Use(async (context) => func with logic for logging });
    

  2. I can recommend you this simple working server template (However it is better to use frameworks like asp net core instead of your approach):

    public class Program
    {
        public static HttpListener listener;
        public static string url = "http://localhost:8000/";
        public static int pageViews = 0;
        public static int requestCount = 0;
        public static string pageData =
            "<!DOCTYPE>" +
            "<html>" +
            "  <head>" +
            "    <title>HttpListener Example</title>" +
            "  </head>" +
            "  <body>" +
            "    <p>Page Views: {0}</p>" +
            "    <form method="post" action="shutdown">" +
            "      <input type="submit" value="Shutdown" {1}>" +
            "    </form>" +
            "  </body>" +
            "</html>";
    
    
        public static async Task HandleIncomingConnections()
        {
            bool runServer = true;
    
            while (runServer)
            {
                HttpListenerContext ctx = await listener.GetContextAsync();
    
                HttpListenerRequest req = ctx.Request;
                HttpListenerResponse resp = ctx.Response;
    
                // Print out some info about the request
                Console.WriteLine("Request #: {0}", ++requestCount);
                Console.WriteLine(req.Url.ToString());
                Console.WriteLine(req.HttpMethod);
                Console.WriteLine(req.UserHostName);
                Console.WriteLine(req.UserAgent);
                Console.WriteLine();
    
                if ((req.HttpMethod == "POST") && (req.Url.AbsolutePath == "/shutdown"))
                {
                    Console.WriteLine("Shutdown requested");
                    runServer = false;
                }
    
                // Write the response info
                var disableSubmit = !runServer ? "disabled" : "";
                var data = Encoding.UTF8.GetBytes(String.Format(pageData, pageViews, disableSubmit));
                resp.ContentType = "text/html";
                resp.ContentEncoding = Encoding.UTF8;
                resp.ContentLength64 = data.LongLength;
    
                await resp.OutputStream.WriteAsync(data, 0, data.Length);
                resp.Close();
            }
        }
    
    
        public static void Main(string[] args)
        {
            listener = new HttpListener();
            listener.Prefixes.Add(url);
            listener.Start();
            Console.WriteLine("Listening for connections on {0}", url);
    
            var listenTask = HandleIncomingConnections();
            listenTask.GetAwaiter().GetResult();
    
            listener.Close();
        }
    
    
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search