Поделиться кодом HttpContext между веб-и не веб-приложениями - PullRequest
2 голосов
/ 13 ноября 2008

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 02 января 2009

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

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

Спасибо, C

1 голос
/ 13 ноября 2008

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

Если вы создадите такой интерфейс (например, в вашем слое 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) для настройки в вашей веб-конфигурации того, что должен использоваться экземпляр WebPeferredLanguage и в ваших winforms должен возвращаться одиночный экземпляр WinformsPeferredLanguage. *

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

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

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

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

1 голос
/ 13 ноября 2008

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

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

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

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

0 голосов
/ 02 марта 2014

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

Thread.CurrentUICulture

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

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

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

0 голосов
/ 13 ноября 2008

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

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

0 голосов
/ 13 ноября 2008

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

...