我们有一个跨国网站,为其服务的各个国家/地区提供本地化内容.使用标准.Net资源文件实现此本地化.
当我们的Web应用程序在生产环境中启动或回收负载时,有时会显示特定国家/地区的错误资源.例如,英国网站可能会显示法语内容.
这将继续发生,直到重新启动应用程序.
生产环境是Windows Server 2012上的IIS 8.该应用程序在ASP.Net MVC 4中实现.
应用程序决定传入URL所服务的区域设置.所以www.mysite.com将是英国英语www.mysite.fr将是法语等.
我们有一个IHttpModule的实现,它通过Web.config注册.在模块的Init方法中,它将一个处理程序附加到BeginRequest事件.在此方法中,将检查传入的URL,并将线程的CurrentUICulture设置为适当的值.en-GB代表www.mysite.com,fr-FR代表www.mysite.fr等.
该系统在大多数情况下运行良好.但是,有时当应用程序在接收请求时启动时,它将始终为某些资源文件提供错误的内容.
它将继续执行此操作,直到重新启动应用程序.它可能会再次重新启动提供错误的内容.我们必须继续重新启动,直到它提供正确的内容,此时它将保持稳定.
通过在启动期间向应用程序发送请求(使用Fiddler),我们已经能够在开发PC上本地重现这一点.该网站显示了英国版网站上某些资源文件的德语内容.
检查过明显的罪魁祸首在我们的代码(该的CurrentUICulture是由HTTP模块正确设置并保持整个请求的处理是正确的),我们开始来看看资源管理器.
在应用程序以不正确的状态启动时,我们检查了ResourceManager类上_resourceSets属性的内容.这是一个以ISO文化代码为主的字典.检查en-GB的内容,我们发现它确实包含来自德语版资源文件的资源字符串.
似乎有时,当站点在接收请求时启动时,ResourceManager类正在为文化加载错误的资源文件,或者它在其Dictionary中错误地对文件进行了分类.
有没有其他人经历过这种行为,是否有人知道任何变通办法?
谢谢.
我有一个有趣的(阅读:令人沮丧的)问题从C#WPF应用程序启动控制台应用程序并重定向其stdin和stdout.
它主要是启动和工作,但我似乎最终没有从stdout获取一些数据,一旦我开始重定向stdin.
我将用一个例子来澄清.如果我没有在STARTUPINFO结构中设置hStdInput,当我启动子进程时,我收到以下内容:
MongoDB shell version: 2.2.0
connecting to: test
local:PRIMARY>
Run Code Online (Sandbox Code Playgroud)
一旦我设置了hStdInput,我就得到这个:
MongoDB shell version: 2.2.0
connecting to: test
Run Code Online (Sandbox Code Playgroud)
我知道BackgroundWorker处理标准输出仍在运行,因为如果我在stdin上向进程发送一些内容,它会相应地做出响应.
use TestDB
switched to db TestDB
Run Code Online (Sandbox Code Playgroud)
所以,这就是我创建流程的方式:
_processInfo = new ProcessInfo();
bool ok = false;
SECURITY_ATTRIBUTES sattr = new SECURITY_ATTRIBUTES();
sattr.bInheritHandle = 1;
unsafe
{
sattr.lpSecurityDescriptor = null;
}
sattr.nLength = Marshal.SizeOf(sattr);
IntPtr hWrite;
ok = CreatePipe(out _hReadStdOut, out hWrite, ref sattr, 0);
ok = SetHandleInformation(_hReadStdOut, HANDLE_FLAGS.INHERIT, 0);
IntPtr hRead;
ok = CreatePipe(out hRead, out _hWriteStdIn, ref sattr, 0);
ok …Run Code Online (Sandbox Code Playgroud)