Совместное использование кода HttpContext между веб- и не веб-приложениями

StackOverflow https://stackoverflow.com/questions/286468

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть VB.NET модуль, который считывает данные из файла ресурсов для отображения текста на правильном языке.Вот моя проблема - этот код является общим для веб-приложения и не-веб-приложения, В веб-приложении я использую System.Web.HttpContext для определения предпочитаемого пользователем языка, но теперь мое приложение для Windows даже не компилируется, потому что оно говорит, что HttpContext не определен (я уже пробовал добавить импорт для полного пространства имен - без кубиков).

Я бы с удовольствием использовал какой-нибудь блок try / catch, если я не могу иначе обойти это, но это не меняет того, что приложение Windows не будет компилироваться со ссылкой на HttpContext в нем.Не перемещая этот фрагмент кода в новый файл и не включая его только в веб-приложение (у меня нет этого приложения, поэтому я бы предпочел не разбираться с этими последствиями), есть ли у меня другой выбор, чтобы справиться с этим?

Если это не имеет смысла, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы прояснить ситуацию.

РЕШЕНИЕ: Я только что добавил ссылку на System.Web, которая позволила моему приложению скомпилироваться.Я также завернул ссылку на HttpContext в "Если HttpContext.Current не является Ничем, тогда...Блок "End If", который заставляет его пропускать код, если он не запущен как веб-приложение, а это именно то, что я искал.

Это было полезно?

Решение

Если вы ссылаетесь на System.Веб-сборка, вам должен быть предоставлен доступ к HttpContext.Current, который является ссылкой на объект HttpContext текущего веб-приложения.Если приложение является обычным приложением Win32, эта ссылка должна быть нулевым указателем.Таким образом, в C # вы бы использовали: if (HttpContext.Current == null) или в VB вы могли бы использовать: If HttpContext.Current Is Nothing Then

Однако я никогда не пробовал делать что-то подобное, поэтому не могу гарантировать результат.Дайте мне знать, если это вас устроит.

Спасибо, С

Другие советы

Даже если приложение скомпилируется, у вас возникнет проблема отсутствия HttpContext в WinApp.

Вы можете провести рефакторинг веб-приложения, чтобы вместо HttpContext он использовал службу, например. IContextService или набор служб (ICacheService, ISessionService и т. Д.).

Будет две реализации службы: одна для веб-приложения, которое будет использовать HttpContext, и другая для winapp, реализация которой будет содержать необходимую логику для определения пользовательских предпочтений (язык и т. д.).

Если настройки хранятся на сервере, вам потребуется реализовать какой-либо сервис для связи между вашим winapp и сервером.

Я думаю, что вы могли бы использовать немного развязки!

Если вы создадите такой интерфейс (например, в вашем слое BLL)

public interface IPreferredLanguage
{
     String PeferredLanguage { get; set; }
}

и вы создадите две реализации:

В вашем веб-сайте проекта:

public class WebPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get
          {
               return // retrieve the language from the http context
          }
          set
          {
               // set the preferred language in the HttpContext
          }
     } 
}

В вашем проекте winforms:

public class WinformsPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get; set; // automatic properties
     } 
}

Здесь и далее вы используете инверсию управления (Unity, StructureMap, MicroKernel) для настройки в своем webconfig, что должен использоваться экземпляр WebPeferredLanguage, а одиночный экземпляр WinformsPeferredLanguage должен быть возвращен в ваших winforms.

В своем коде всякий раз, когда вам нужно знать язык, вы просто запрашиваете у контейнера IoC правильную реализацию IPreferredLanguage, и он возвращает объект настроенного вами типа.

так что в вашем bll вы можете программировать (например):

public String GetEmailMessage()
{
    var currentLanguage = IoC.Resolve<IPreferredLanguage>().PeferredLanguage;
    return Resources[currentLanguage ].EmailMessage;
}

После написания этой статьи я вижу, что вам нужно решение VB.NET. Ну, примеры все еще применимы, только это немного другая грамматика (извините, если так сложнее читать).

Вы можете добавить System.Web.dll в свое приложение, а затем использовать HttpContext. Проблема в том, что в вашем выигрышном приложении нет HttpContext, поэтому вы должны использовать веб-сервис или WCF для связи между двумя приложениями.

Если возможно, возможно, лучшее, что вы могли бы сделать, это полностью удалить зависимость от наличия HTTP-контекста в общей сборке.

Например, упомянутый вами метод, использующий HttpContext для получения предпочтения пользователя, может быть реорганизован так, чтобы вместо него был задан язык. Когда вы вызываете метод из своего веб-приложения, вы можете передать язык из HttpContext, а когда вы вызываете его из приложения Windows, вам нужно будет передать язык из другого источника.

Вы должны использовать

Thread.CurrentUICulture

для определения языка пользователя. Он также поддерживается в WinForms и WebApplication.

.NET Framework устанавливает его для вас в большинстве случаев.

Вы можете настроить его, когда ваша программа / поток запускается. В веб-приложении вы можете установить его в Global.asax.cs в Application_BeginRequest.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top