Как получить экземпляр текущего HttpRequestBase вне Контроллера или контекста View - PullRequest
0 голосов
/ 27 января 2012

Что я делаю:

Я создаю механизм почтовой рассылки, который принимает шаблоны HTML, заменяет токены данными и затем отправляет почту на SMTP-сервер.В конечном итоге нам понадобится пользовательский интерфейс CMS, который позволит им добавлять / удалять шаблоны файлов или обновлять содержимое в них через пользовательский интерфейс CMS.В любом случае, я помещаю файлы .htm для шаблонов электронной почты в свой веб-проект MVC, и мне нужно прочитать их содержимое и вернуть строку HTML для работы.Если я перенесу весь этот код из своего MVC-проекта в слой уровня служебной программы C #, проблема заключается в том, что мне придется беспокоиться о поддержании физических путей («C: ... \ theMVCWebSiteFolder ... \ Email \ Templates \ SomeTemplate».htm "), и это для меня должно быть жестко закодировано, я думаю, чтобы отслеживать, если бы вы переместить сайт на другой сервер, другой раздел жесткого диска и т. д. Так что я хотел бы иметь возможность работать с файламииспользуя контекст текущего приложения, если только нет способа сделать это независимым от моего приложения MVC, и при этом не нужно беспокоиться о необходимости когда-либо менять местоположение физического корня каждый раз, когда мы перемещаем папки.

У меня естьследующий служебный метод, который я создал в служебном классе, который находится в папке где-то в моем веб-проекте ASP.NET MVC, просто в папке (папке вне любых папок просмотра:

public static string GetFileData(string filePath)
{
    if (!File.Exists(HttpContext.Current.Request.PhysicalApplicationPath + filePath))
        throw new FileNotFoundException(String.Format("the file {0} was not found", filePath));

    string text;
    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);

    using(StreamReader read = new StreamReader(fileStream))
        text = read.ReadToEnd();

    return text;
}

Я пытаюсьчтобы выяснить, почему контекст обнуляется здесь.Я первоначально попытался HttpContext.Current, но текущий идет ноль, поэтому он не может найтитекущий контекст в моем методе Utility.cs, который находится в моем веб-проекте MVC.

UPDATE:

Хорошо, так что согласие заключается в использовании объекта HttpRequestBase, а не объекта HttpContext.Current.Я все еще нахожу странным, что HttpContext.Current имеет значение null.Но, двигаясь дальше, если мой Utility.cs находится вне контекста контроллера или представления, то как, черт возьми, я могу получить экземпляр текущего запроса (HttpRequestBase) для работы и отправить экземпляр, который реализует HttpRequestBase (я не знаю,что это за объект, если я захочу сделать это "способом MVC" вне контроллера или представления) для этого служебного метода?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Не знаю, почему это возвращает ноль, но поскольку связывать ваши бизнес-уровни со спецификой ASP.NET плохая идея, я бы порекомендовал вам следующее изменение вашего метода:вам нужно использовать его из веб-приложения:

public ActionResult Foo()
{
    var result = MyClass.GetFileData(Server.MapPath("~/foo/bar.txt"));
    ...
}

, а когда вам нужно использовать его в приложении WinForms:

protected void Button1_Click(object sender, EventArgs e)
{
    var filePath = Path.Combine(Environment.CurrentDirectory, "bar.txt");
    var result = MyClass.GetFileData(filePath);
    ...
}
2 голосов
/ 27 января 2012

В служебном классе я бы удалил зависимость от любого материала, связанного с сетью.

Для пути относительно корня приложения я бы использовал:

Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, fileName)

, который даст вамчто вы, вероятно, хотите (путь относительно корневого веб-каталога в веб-приложении; относительно пути, содержащего исполняемый файл в приложении WinForms, ...)

1 голос
/ 27 января 2012

Если вы хотите переписать этот метод в asp.net mvc, вы можете переписать его таким образом и удалить связь с HttpContext class

public static string GetFileData(HttpRequestBase request, string filePath)
{
    if (!File.Exists(request.PhysicalApplicationPath + filePath))
        throw new FileNotFoundException(String.Format("the file {0} was not found", filePath));

    string text;
    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);

    using(StreamReader read = new StreamReader(fileStream))
        text = read.ReadToEnd();

    return text;
}

И вообще в MVC HttpContext, HttpRequest и HttpResponse абстрагированы в HttpContextBase, HttpRequestBase и HttpResponseBase соответственно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...