我有一个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应用程序运行的话,它会跳过代码,这正是我正在寻找的。
答案 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中进行设置。