更新:问题解决了,并保持解决. 如果您想查看该网站的运行情况,请访问Tweet08
我有几个查询在SSMS中与在我的.Net应用程序中运行时的行为不同.SSMS在一秒钟内执行正常..Net调用在120秒后超时(连接默认超时).
我做了一个SQL跟踪(并收集了一切)我已经看到连接选项是相同的(并匹配SQL Server的默认值).然而,SHOWPLAN All在行估计中显示出巨大的差异,因此工作版本会使用激进的表Spool,因为失败的调用没有.
在SSMS中,临时变量的数据类型基于.Net中生成的SQL参数,因此它们是相同的.
在VS2008调试会话中,在Cassini下执行失败.成功归功于SSMS 2008.两者都在同一台机器上的同一网络上运行相同的目标服务器.
SSMS中的查询:
DECLARE @ContentTableID0 TINYINT
DECLARE @EntryTag1 INT
DECLARE @ContentTableID2 TINYINT
DECLARE @FieldCheckId3 INT
DECLARE @FieldCheckValue3 VARCHAR(128)
DECLARE @FieldCheckId5 INT
DECLARE @FieldCheckValue5 VARCHAR(128)
DECLARE @FieldCheckId7 INT
DECLARE @FieldCheckValue7 VARCHAR(128)
SET @ContentTableID0= 3
SET @EntryTag1= 8
SET @ContentTableID2= 2
SET @FieldCheckId3= 14
SET @FieldCheckValue3= 'igor'
SET @FieldCheckId5= 33
SET @FieldCheckValue5= 'a'
SET @FieldCheckId7= 34
SET @FieldCheckValue7= 'a'
SELECT COUNT_BIG(*)
FROM dbo.ContentEntry AS mainCE
WHERE GetUTCDate() BETWEEN mainCE.CreatedOn AND mainCE.ExpiredOn
AND …Run Code Online (Sandbox Code Playgroud) 似乎直接覆盖EF中的SaveChanges以添加审计记录器.请参阅ApplyAuditLogging方法以设置下面的审计属性(创建,创建,更新,更新).
public override int SaveChanges()
{
var autoDetectChanges = Configuration.AutoDetectChangesEnabled;
try
{
Configuration.AutoDetectChangesEnabled = false;
ChangeTracker.DetectChanges();
var errors = GetValidationErrors().ToList();
if(errors.Any())
{
throw new DbEntityValidationException("Validation errors were found during save: " + errors);
}
foreach (var entry in ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
{
ApplyAuditLogging(entry);
}
ChangeTracker.DetectChanges();
Configuration.ValidateOnSaveEnabled = false;
return base.SaveChanges();
}
finally
{
Configuration.AutoDetectChangesEnabled = autoDetectChanges;
}
}
private static void ApplyAuditLogging(DbEntityEntry entityEntry)
{
var logger = entityEntry.Entity as IAuditLogger;
if (logger == null) …Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个随机密码是这样的:
public static int getRandomNumber(int maxNumber)
{
if (maxNumber < 1)
throw new System.Exception("The maxNumber value should be greater than 1");
byte[] b = new byte[4];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
int seed = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];
System.Random r = new System.Random(seed);
return r.Next(1, maxNumber);
}
Run Code Online (Sandbox Code Playgroud)
一些可能的问题?这是一个静态函数,有一些奇怪的种子模式可能不安全,仍然使用System.Random().
使用上面的随机数生成器,我以这种低效的方式创建一个字符串:
validCharacters = "abcdefghjkmnoxyz023456789#!@";
Run Code Online (Sandbox Code Playgroud)
然后使用有效数组循环并获取"createPassword(length)"类型字符串(注意使用不包含容错字符的字符集,如1 i等).
这是如何做到的,还是有更简单,更安全,更有效的方式?
尝试cot.ag/o1LnfW从 .NET 使用 HttpWebRequest使用 URI ,我得到 301 Moved 响应,响应头 Location 有一个(不正确的)值:
http://www.joycemeyer.org/BroadcastHome.aspx?video=Living_Beyond_Your_Feelings_â_Pt_1&utm_source=Twitter&utm_campaign=EEL&utm_medium=post&utm_term=September29&utm_content=post
从 Fiddler,我得到了(正确的)Location 标头值:
http://www.joycemeyer.org/BroadcastHome.aspx?video=Living_Beyond_Your_Feelings_–_Pt_1&utm_source=Twitter&utm_campaign=EEL&utm_medium=post&utm_term=September29&utm_content=post
注意到 - 在 Fiddler URL 中出现的不同之处。在 Fiddler 的情况下,字节是 E2 80 93。在 .Net 的情况下,字节是 E2 3F 3F。这会导致不正确的标头解释,随后无法遵循重定向。
我认为这是一个 .NET 框架错误,但我不知道 RFC 说它应该作为什么发送。我应该将此作为错误报告给 Microsoft,还是 bit.ly 在提供错误代码页中的标头时失败?
c# ×2
asp.net-mvc ×1
encoding ×1
location ×1
random ×1
rfc ×1
savechanges ×1
sql ×1
sql-server ×1
ssms ×1
t-sql ×1
timeout ×1