我在一个相当大的ASP .NET Web Forms应用程序上工作,该应用程序目前主要在美国使用.我们正在将其推广到世界其他地区,这当然意味着我们正在努力本地化应用程序的所有领域.一般来说,我们的方法是在每个请求开始时设置当前线程的CurrentCulture和CurrentUICulture属性,以支持基于当前用户的语言环境进行正确的格式化和资源提取.
但是,在某些情况下,我们需要使用除当前用户文化之外的文化来运行某些代码.例如,"用户A"居住在德国,但适用于与法国其他公司有业务往来的公司.当"用户A"想要为其中一家法国公司创建发票(PDF)时,我们希望发票生成代码以"fr-FR"文化而非"de-DE"文化运行.
我已经考虑过几种方法可以很容易地做到这一点,我想知道我是否正确地做到了这一点.我主要关心的是性能和线程安全性.
一种方法涉及一种静态方法,旨在使用提供的文化来运行给定任务.像这样的东西:
public static void RunWithCulture(CultureInfo culture, Action task)
{
if (culture == null)
throw new ArgumentNullException("culture");
var originalCulture = new
{
Culture = Thread.CurrentThread.CurrentCulture,
UICulture = Thread.CurrentThread.CurrentUICulture
};
try
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
task();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture.Culture;
Thread.CurrentThread.CurrentUICulture = originalCulture.UICulture;
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样调用此方法:
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture, () => invoiceService.CreateInvoice(currentCustomer.CustomerId));
Run Code Online (Sandbox Code Playgroud)
我还考虑创建一个实现IDisposable的类,它负责在它的ctor中设置线程文化,然后在Dispose方法中返回原始文化,所以你可以像这样调用它:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
Run Code Online (Sandbox Code Playgroud)
我错了吗?哪个,如果这些方法中的任何一个更可取?
在过去,我从未成为在数据库表上使用触发器的粉丝.对我来说,他们总是表现出一些将在数据库方面发生的"魔力",远离我对应用程序代码的控制.我还想限制数据库必须完成的工作量,因为它通常是一个共享资源,我总是认为触发器在高负载情况下会变得昂贵.
也就是说,我发现了几个使用触发器的实例(至少在我看来它们是有意义的).最近,我发现自己有时可能需要"绕过"触发器.我不得不寻找方法来做到这一点,我仍然感到内疚,我仍然认为更好的数据库设计可以减少对这种绕过的需求.不幸的是,这个数据库被多个应用程序使用,其中一些应用程序是由一个非常不合作的开发团队维护的,他们会对模式更改感到尖叫,所以我被困住了.
关于触发器的一般意见是什么?爱他们?讨厌他们?认为它们在某些情况下有用吗?是否认为需要绕过触发器意味着你"做错了"?
我一直在努力通过阅读尽可能多的javascript代码来提高我的javascript技能.在执行此操作时,我有时会javascript:在HTML元素标记中看到前缀附加到事件处理程序属性的前面.这个前缀的目的是什么?基本上,之间有任何明显的区别:
onchange="javascript: myFunction(this)"
Run Code Online (Sandbox Code Playgroud)
和
onchange="myFunction(this)"
Run Code Online (Sandbox Code Playgroud)
?
我们的Web应用程序(ASP.NET Web窗体)有一个页面,它将向用户显示最近生成的PDF文件.由于PDF文件有时非常大,我们实施了一种"流式"方法,将其以块的形式发送到客户端浏览器.
尽管以块的形式发送数据,但在发送之前我们知道文件的完整大小,因此我们适当地设置Content-Length头.这已经在我们的生产环境中工作了一段时间(并且在我们的测试环境中继续使用几乎相同的配置)直到今天.报告的问题是Chrome会尝试打开PDF文件,但会挂起"加载"动画卡住.
因为在我们的测试环境中一切都运行良好,所以我能够使用Firebug来查看在两种环境中都会返回的响应头.在测试环境中,我看到了一个正确的'Content-Length'标题,而在生产中已被Transfer-Encoding:chunked标头取代.Chrome不喜欢这样,因此挂断电话.
我已经阅读了一些文章和帖子,谈论在没有提供Content-Length标头时如何显示Transfer-Encoding标头,但是我们正在指定Content-Length标头,并且在运行相同的代码时,所有内容仍然可以正常工作测试服务器上的相同PDF文件.
测试服务器和生产服务器都运行IIS 7.5,并且都启用了动态和静态压缩.
这是有问题的代码:
var fileInfo = new FileInfo(fileToSendDown);
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "filename=test.pdf");
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
var buffer = new byte[1024];
using (var fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int read;
while ((read = fs.Read(buffer, 0, 1024)) > 0)
{
if (!response.IsClientConnected) break;
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
}
Run Code Online (Sandbox Code Playgroud)
我很幸运能够在我的本地工作站上看到相同的行为,所以使用调试器我已经能够看到'Transfer-Encoding:chunked'标头是在调用'Flush'期间第二次通过while循环时设置的.此时,响应具有Content-Length头和Transfer-Encoding头,但是当响应到达浏览器时,Firebug仅以某种方式显示Transfer-Encoding头.
UPDATE
我想我已经跟踪了这一点,结合使用"块"发送数据并将"过滤器"附加到HttpResponse对象(我们使用过滤器来跟踪向下发送到每个页面的视图状态的大小) .我们在向浏览器发送PDF时使用HTTP过滤器没有任何意义,因此清除此处的过滤器已解决了我们的问题.我决定纯粹出于好奇心深入挖掘并更新了这个问题,如果其他人在将来偶然发现这个问题.
我在AppHarbor上有一个简单的应用程序可以重现这个问题:http://transferencodingtest.apphb.com/ .如果同时选中"使用过滤器?" 和'发送大块?' 您应该能够看到"transfer-encoding:chunked"标题显示的框(使用Chrome开发工具,Firebug,Fiddler等).如果未选中其中任何一个框,您将获得正确的内容长度标题.基础代码在github上运行,因此您可以看到幕后发生的事情:
https://github.com/appakz/TransferEncodingTest
请注意,要在本地重新登录,您需要在IIS 7.5中设置本地网站(7也可以使用,我还没试过).Visual Studio附带的ASP .NET开发服务器不会重现问题.
我在博客文章中添加了一些更多细节:'Content-Length'标题替换为ASP .NET中的'Transfer-Encoding:Chunked'
为简单起见,我通常将大量配置(即app.config和web.config的内容)拆分为单独的.config文件,然后使用'configSource'属性从主配置文件中引用它们.例如:
<appSettings configSource="appSettings.config"/>
Run Code Online (Sandbox Code Playgroud)
然后将所有键/值对放在该appSettings.config文件中,而不是在主配置文件中使用此内联:
<appSettings>
<add key="FirstKey" value="FirstValue"/>
<add key="SecondKey" value="SecondValue"/>
...
</appSettings>
Run Code Online (Sandbox Code Playgroud)
这通常适用于应用程序本身,但在尝试编写单元测试时遇到问题,无论出于何种原因,单元测试需要从存储在其中一个外部文件中的配置部分获取某些值.(我知道大多数这些都可能被认为是"集成测试",因为它们依赖于配置系统,我也有"纯单元测试",但那些不是问题.我真的在寻找测试是否正确检索这些配置值并以正确的方式影响行为).
由于MSTest如何编译并将输出复制到与每次测试运行不同的模糊文件夹(而不是像你想象的那样到'bin'文件夹),它似乎永远无法在测试时找到那些外部文件正在执行.我已经尝试过使用后期构建操作来完成这项工作,但没有运气.有没有办法在运行时将这些外部文件复制到正确的输出文件夹中?
在打开.xap作为Silverlight应用程序输出生成的文件时,我最近一直在修补,我注意到一个名为的文件AppManifest.xaml.
我还注意到Silverlight项目的属性页中有一个选项,它允许您选择不AppManifest.xaml为项目输出.但是,取消选中该选项时,运行应用程序时会出错:Invalid or malformed application: Check manifest.
该AppManifest.xaml文件的目的是什么?
我们在单个Web服务器上运行一个ASP .NET应用程序(没有服务器场).目前,我们正在使用默认的"InProc"会话存储.是否值得考虑使用ASP .NET状态服务?如果我们走这条路线,我们可能只是在与应用程序相同的机器上运行服务,因此通过网络拨打电话来获取和设置会话信息不会成为问题.我们考虑这个问题的原因是为了避免在应用程序池回收时丢失会话数据.
此外,暂时使用SQL Server是不合适的,因此我们只讨论进程内与状态服务器.
在这种情况下,每种模式的优缺点是什么?
我希望获取运行报告的结果(Crystal Reports中的PDF文件),序列化它,将其粘贴到varbinary字段中,然后再将其反序列化并将其呈现给用户.
现在我只需要简单的旧ADO .NET(SqlClient,SqlCommand等)
这有什么陷阱吗?鉴于我会知道本地机器上当前保存PDF文件的路径,实现此目的的基本语法是什么?
我有一个VS 2005网站项目(不是Web应用程序项目模型,'网站'项目模型),我希望能够通过"发布网站"命令在bin文件夹中包含页面程序集的PDB文件在Visual Studio中帮助调试问题.
无论我尝试"调试/发布"模式设置,我发布网站后,似乎无法让网站程序集的PDB文件显示在"bin"文件夹中.我确实得到了任何外部引用程序集,但不是实际的网站代码隐藏程序集,这是我需要的.
使用网站项目模型发布时,如何让Visual Studio包含这些文件?
我需要在SQL Server Reporting Services报告中确定用户所属的安全组.对报告的访问将由两个组中的一个成员驱动:'report_name_summary'和'report_name_detail'.一旦用户执行报告,我们希望能够在"report_name_detail"组中使用其成员资格(或缺少成员资格)来确定是否应允许"向下钻取".
我不知道开箱即用的任何方式来访问当前用户的AD安全组成员身份,但我愿意接受能够从报告中访问此信息的任何建议.
限制用户可以在网页上的"textarea"字段中输入的文本数量的最佳方法是什么?有问题的应用程序是ASP .NET,但首选平台无关的答案.
我知道可能需要一些javascript来完成这项工作,因为我不希望实际使用该数据量执行'post',因为ASP .NET确实对请求的大小有一个上限将服务(虽然我不知道究竟是什么).
所以也许真正的问题是,在符合以下条件的javascript中执行此操作的最佳方法是什么:
- 对于两个用户来说,只需输入数据并从其他来源复制/粘贴数据即可.
- 必须尽可能友好'508合规'.
asp.net ×4
.net ×2
c# ×2
javascript ×2
sql-server ×2
blob ×1
cultureinfo ×1
file ×1
html ×1
iis-7.5 ×1
localization ×1
mstest ×1
silverlight ×1
triggers ×1
unit-testing ×1