खोज…


बेसिक रीड-ओनली HTTP फ़ाइल सर्वर (HttpListener)

टिप्पणियाँ:

यह उदाहरण प्रशासनिक मोड में चलाया जाना चाहिए।

केवल एक साथ ग्राहक का समर्थन किया जाता है।

सादगी के लिए, फ़ाइलनाम को सभी ASCII ( सामग्री-विवाद शीर्षक में फ़ाइलनाम भाग के लिए) माना जाता है और फ़ाइल पहुंच त्रुटियों को नियंत्रित नहीं किया जाता है।

using System;
using System.IO;
using System.Net;

class HttpFileServer
{
    private static HttpListenerResponse response;
    private static HttpListener listener;
    private static string baseFilesystemPath;

    static void Main(string[] args)
    {
        if (!HttpListener.IsSupported)
        {
            Console.WriteLine(
                "*** HttpListener requires at least Windows XP SP2 or Windows Server 2003.");
            return;
        }

        if(args.Length < 2)
        {
            Console.WriteLine("Basic read-only HTTP file server");
            Console.WriteLine();
            Console.WriteLine("Usage: httpfileserver <base filesystem path> <port>");
            Console.WriteLine("Request format: http://url:port/path/to/file.ext");
            return;
        }

        baseFilesystemPath = Path.GetFullPath(args[0]);
        var port = int.Parse(args[1]);

        listener = new HttpListener();
        listener.Prefixes.Add("http://*:" + port + "/");
        listener.Start();

        Console.WriteLine("--- Server stated, base path is: " + baseFilesystemPath);
        Console.WriteLine("--- Listening, exit with Ctrl-C");
        try
        {
            ServerLoop();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
            if(response != null)
            {
                SendErrorResponse(500, "Internal server error");
            }
        }
    }

    static void ServerLoop()
    {
        while(true)
        {
            var context = listener.GetContext();

            var request = context.Request;
            response = context.Response;
            var fileName = request.RawUrl.Substring(1);
            Console.WriteLine(
                "--- Got {0} request for: {1}", 
                request.HttpMethod, fileName);

            if (request.HttpMethod.ToUpper() != "GET")
            {
                SendErrorResponse(405, "Method must be GET");
                continue;
            }

            var fullFilePath = Path.Combine(baseFilesystemPath, fileName);
            if(!File.Exists(fullFilePath))
            {
                SendErrorResponse(404, "File not found");
                continue;
            }

            Console.Write("    Sending file...");
            using (var fileStream = File.OpenRead(fullFilePath))
            {
                response.ContentType = "application/octet-stream";
                response.ContentLength64 = (new FileInfo(fullFilePath)).Length;
                response.AddHeader(
                    "Content-Disposition",
                    "Attachment; filename=\"" + Path.GetFileName(fullFilePath) + "\"");
                fileStream.CopyTo(response.OutputStream);
            }

            response.OutputStream.Close();
            response = null;
            Console.WriteLine(" Ok!");
        }
    }

    static void SendErrorResponse(int statusCode, string statusResponse)
    {
        response.ContentLength64 = 0;
        response.StatusCode = statusCode;
        response.StatusDescription = statusResponse;
        response.OutputStream.Close();
        Console.WriteLine("*** Sent error: {0} {1}", statusCode, statusResponse);
    }
}

बेसिक रीड-ओनली HTTP फाइल सर्वर (ASP.NET Core)

1 - एक खाली फ़ोल्डर बनाएं, इसमें अगले चरणों में बनाई गई फाइलें होंगी।

2 - निम्नलिखित सामग्री के साथ project.json नामक एक फ़ाइल बनाएं (पोर्ट संख्या और rootDirectory को उपयुक्त के रूप में समायोजित करें):

{
  "dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:60000"
  },

  "frameworks": {
    "dnxcore50": { }
  },

  "fileServer": {
    "rootDirectory": "c:\\users\\username\\Documents" 
  }
}

3 - निम्नलिखित कोड के साथ Startup.cs नामक एक फ़ाइल बनाएं:

using System;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.FileProviders;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.StaticFiles;
using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        var builder = new ConfigurationBuilder();
        builder.AddJsonFile("project.json");
        var config = builder.Build();
        var rootDirectory = config["fileServer:rootDirectory"];
        Console.WriteLine("File server root directory: " + rootDirectory);

        var fileProvider = new PhysicalFileProvider(rootDirectory);

        var options = new StaticFileOptions();
        options.ServeUnknownFileTypes = true;
        options.FileProvider = fileProvider;
        options.OnPrepareResponse = context =>
        {
            context.Context.Response.ContentType = "application/octet-stream";
            context.Context.Response.Headers.Add(
                "Content-Disposition",
                $"Attachment; filename=\"{context.File.Name}\"");
        };
        
        app.UseStaticFiles(options);
    }
}

4 - एक कमांड प्रॉम्प्ट खोलें, फ़ोल्डर में नेविगेट करें और निष्पादित करें:

dnvm use 1.0.0-rc1-final -r coreclr -p
dnu restore

नोट: इन आदेशों को केवल एक बार चलाने की आवश्यकता है। कोर CLR के नवीनतम इंस्टॉल किए गए संस्करण की वास्तविक संख्या की जांच करने के लिए dnvm list का उपयोग करें।

5 - सर्वर को इसके साथ शुरू करें: dnx web । फाइलें अब http://localhost:60000/path/to/file.ext पर मांगी जा सकती हैं।

सादगी के लिए, फ़ाइलनाम को सभी ASCII (सामग्री-विवाद शीर्षक में फ़ाइलनाम भाग के लिए) माना जाता है और फ़ाइल पहुंच त्रुटियों को नियंत्रित नहीं किया जाता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow