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

问题描述:

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

如果我不能解决它,我会喜欢使用某种try/catch块,但这并不会改变Windows应用程序不会在其中引用HttpContext进行编译。如果不将这段代码移入一个新文件并仅将其包含在Web应用程序中(我不拥有该应用程序,所以我宁愿不处理这些影响),是否有另一个选择需要处理?

如果没有意义,请让我知道,我会尽我所能来澄清。

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

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

但是,我从来没有试图做这样的东西,所以我不能保证结果。让我知道这是否适合你。

感谢, Ç

+0

如果你运行的是NUnit GUI工具,那么它不起作用,在这种情况下它不为空:( – 2009-07-03 13:30:19

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

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

你可以重构web应用程序,而不是HttpContext它会使用服务,例如。 IContextService或一堆服务(ICacheService,ISessionService等)。

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

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

如果可能,你可以做的最好的事情是完全删除在共享程序集中拥有HTTP上下文的依赖。

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

我想你可以使用一点点的去耦!

如果您想创建这样一个接口(在你BLL例如层)

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

和you'de创建两种实现方式:

在你的网站项目:

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的实例,并且WinformsPeferredLanguage的单例实例应该返回到您的winforms中。

在您的代码中,无论何时您需要知道该语言,只需向IoC容器询问IPreferredLanguage的正确实现,它就会返回您已配置的类型的对象。

所以在您的BLL,你可以程序(例如):

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

写在这之后,我看到你想要一个VB.NET的解决方案。那么,这些例子仍然适用,只是它的语法略有不同(抱歉,如果这种方式很难读)。

+0

ps,这不是使用IoC容器的方式,您应该使用依赖注入来注入IPrefferedLanguage实现。 – 2010-05-14 17:09:19

您应该使用

Thread.CurrentUICulture 

来确定用户的语言。它在WinForms和WebApplication中也受支持。

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

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