在Web和非Web应用程序之间共享HttpContext代码

时间:2008-11-13 07:49:43

标签: asp.net vb.net httpcontext

我有一个VB.NET模块,它从资源文件中读取,以正确的语言显示文本。这是我的问题 - 这个代码在Web应用程序和非Web应用程序之间共享,在Web应用程序中,我使用System.Web.HttpContext来确定用户的首选语言,但现在我的Windows应用程序甚至都不会编译,因为它说没有定义HttpContext(我已经尝试为完整的命名空间添加导入 - 没有骰子)。

如果我不能解决它,我会喜欢使用某种try / catch块,但这并没有改变Windows应用程序不会在其中引用HttpContext进行编译。如果没有将这一块代码移动到一个新文件中并且仅将其包含在Web应用程序中(我没有拥有该应用程序,所以我宁愿不处理这些含义),还有其他选择我必须处理这个问题吗?

如果没有意义,请告诉我,我会尽力澄清。

解决方案:我刚刚添加了对System.Web的引用,它允许我的应用程序进行编译。我还将HttpContext引用包装在“If HttpContext.Current is not Nothing Then ... End If”块中,如果它不是作为Web应用程序运行的话,它会跳过代码,这正是我正在寻找的。

6 个答案:

答案 0 :(得分:3)

如果引用System.Web程序集,则应该可以访问HttpContext.Current,它是对当前运行的Web应用程序的HttpContext对象的引用。如果应用程序是普通的Win32应用程序,则此引用应为空指针。因此在C#中你会使用: if (HttpContext.Current == null) 或者在VB中你可以使用: If HttpContext.Current Is Nothing Then

但是,我从未尝试做过这类事情,所以我无法保证结果。如果这对您有用,请告诉我。

谢谢, ç

答案 1 :(得分:1)

即使应用程序会编译,你也会遇到WinApp中没有HttpContext的问题。

你可以重构webapp,这样它就可以使用服务,而不是HttpContext。 IContextService或一堆服务(ICacheService,ISessionService等)。

该服务将有两个实现:一个用于将使用HttpContext的Web应用程序和一个用于winapp的实现,其中包含确定用户首选项(语言等)的必要逻辑。

如果首选项存储在服务器上,则需要实现某种服务以在winapp和服务器之间进行通信。

答案 2 :(得分:1)

我认为你可以使用一点脱钩!

如果您要创建这样的界面(例如在您的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
     } 
}

此后,您使用Inversion of Control(Unity,StructureMap,MicroKernel)在您的webconfig中配置应使用WebPeferredLanguage的实例,并且应在winforms中返回WinformsPeferredLanguage的单个实例。

在您需要知道语言的代码中,您只需要IoC容器正确实现IPreferredLanguage,它将返回您已配置类型的对象。

所以在你的bll你可以编程(例如):

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

写完之后,我发现你想要一个VB.NET解决方案。好吧,这些例子仍然适用,只是语法略有不同(对不起,如果用这种方式阅读起来比较困难的话)。

答案 3 :(得分:0)

您可以将System.Web.dll添加到您的应用程序,然后使用HttpContext。问题是你赢得应用程序时没有HttpContext,所以你应该使用Web服务或WCF在两个应用程序之间进行通信。

答案 4 :(得分:0)

如果可能的话,你可能做的最好的事情就是彻底消除在共享程序集中拥有HTTP上下文的依赖。

例如,您提到的使用HttpContext获取用户首选的方法可以重构,以便将语言作为参数给出。当您从Web应用程序调用该方法时,您可以从HttpContext传递语言,当您从Windows应用程序调用它时,您需要从另一个源传入该语言。

答案 5 :(得分:0)

你应该使用

Thread.CurrentUICulture

确定用户语言。 WinForms和WebApplication也支持它。

在大多数情况下,.NET框架会为您设置它。

您可以在程序/线程启动时进行设置。在Web应用程序中,您可以在Application_BeginRequest中的Global.asax.cs中进行设置。