Как разделить URL запрос с помощью HttpListener?

Как мне определить, запрашивает ли клиент путь или файл при получении запроса от него в HttpListener? Если запрашивается файл, как я могу возвратить клиенту содержимое файла с соответствующим mime-типом? Например, как я могу вернуть иконку, если запрос идет по пути "/favicon.ico", и вызвать определенный класс и метод по запрошенному пути, если это путь, а не файл?
  • 18 декабря 2023 г. 12:27
Ответы на вопрос 2
При получении запроса через HttpListener вы можете разделить URL запроса на путь и имя файла с помощью класса `Uri`. 

Пример использования:

```csharp
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");

listener.Start();

while (true)
{
    HttpListenerContext context = listener.GetContext();
    HttpListenerRequest request = context.Request;
    HttpListenerResponse response = context.Response;

    // Разделение URL на путь и имя файла
    Uri uri = request.Url;
    string path = uri.AbsolutePath;
    string fileName = Path.GetFileName(path);

    if (string.IsNullOrEmpty(fileName))
    {
        // Если имя файла пусто, значит запрашивается путь
        // Здесь вы можете вызвать определенный класс и метод по запрошенному пути
    }
    else
    {
        // Если запрашивается файл, вы можете вернуть его содержимое с соответствующим mime-типом
        string mimeType = GetMimeType(fileName);

        response.ContentType = mimeType;
        Stream responseStream = response.OutputStream;
        using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
        {
            fileStream.CopyTo(responseStream);
        }
    }

    response.Close();
}

listener.Stop();
```

В приведенном примере используется функция `GetMimeType`, которая определяет mime-тип файла на основе его расширения. Вы можете реализовать эту функцию самостоятельно или использовать готовые решения из существующих библиотек.

```csharp
private string GetMimeType(string fileName)
{
    string extension = Path.GetExtension(fileName);
    string mimeType = "application/octet-stream"; // Mime-тип по умолчанию

    // Определение mime-типа файла на основе расширения
    switch (extension.ToLower())
    {
        case ".ico":
            mimeType = "image/x-icon";
            break;
        case ".txt":
            mimeType = "text/plain";
            break;
        // Другие типы файлов...
    }

    return mimeType;
}
```

В примере mime-тип для файла с расширением .ico установлен как "image/x-icon". Вы можете добавить другие расширения и mime-типы по своему усмотрению.
1. Жесткие пути с файлами (favicon.ico в примере) - отдаешь нужный файл 
2. Префикс для путей файлов (/static/... например) - проверяешь файл и отдаешь ответ
Похожие вопросы