Обработка FileContentResult, когда файл не найден - PullRequest
9 голосов
/ 23 июня 2011

У меня есть действие контроллера, которое загружает файл из BLOB-объекта Azure на основе ссылочного имени контейнера (то есть полного пути к файлу в BLOB-объекте).Код выглядит примерно так:

public FileContentResult GetDocument(String pathName)
{
    try
    {
        Byte[] buffer = BlobStorage.DownloadFile(pathName);
        FileContentResult result = new FileContentResult(buffer, "PDF");
        String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
        // get the last one as actual "file name" based on some convention
        result.FileDownloadName = folders[folders.Length - 1];

        return result;
    }
    catch (Exception ex)
    {
        // log error
    }
    // how to handle if file is not found?
    return new FileContentResult(new byte[] { }, "PDF");
}

В классе BlobStorage есть мой вспомогательный класс для загрузки потока из BLOB-объекта.

Мой вопрос сформулирован в комментарии к коду: Какя должен обработать сценарий, когда файл / поток не найден?В настоящее время я передаю пустой файл PDF, который, на мой взгляд, не лучший способ сделать это.

Ответы [ 2 ]

19 голосов
/ 23 июня 2011

Правильный способ обработки не найденного в веб-приложении - это возвращение клиенту кода состояния 404 HTTP, который в терминах ASP.NET MVC переводит в возвращение HttpNotFoundResult из действия вашего контроллера:

return new HttpNotFoundResult();

Ой, ой, не заметил, что вы все еще работаете на ASP.NET MVC 2. Вы можете реализовать это самостоятельно, потому что HttpNotFoundResult был представлен только в ASP.NET MVC 3:

public class HttpNotFoundResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 404;
    }
}
1 голос
/ 11 января 2019

В ASP.NET Core используйте NotFound()

Ваш контроллер должен наследовать Controller, а метод должен возвращать ActionResult

Пример:

public ActionResult GetFile(string path)
{
    if (!File.Exists(path))
    {
        return NotFound();
    }
    return new FileContentResult(File.ReadAllBytes(path), "application/octet-stream");
}
...