gpt4 book ai didi

c# - 替换文本字符串时出现奇怪的 C# 错误

转载 作者:太空狗 更新时间:2023-10-30 00:55:51 25 4
gpt4 key购买 nike

我们有一个注册类型的系统,一旦完成就会发送一封确认电子邮件。该系统在几分钟内有大约 3000 个注册,我们注意到一个错误。如果用户 A 在用户 B 注册后几毫秒注册,则用户 A 将通过电子邮件获得用户 B 的详细信息。我们确实设法解决了这个问题,我将它缩小到这段代码,它从缓存中获取电子邮件模板,并只对占位符进行字符串替换。

private string ProcessEmailBody(MyRegistrationModel registration)
{
var content = CacheHelper.GetContent("REGISTRATIONEMAIL");

if (content != null)
{
content.Text = context.Text.Replace("@@FULL_NAME@@", registration.FullName);

return content.Text;
}
else return null;
}

CacheHelper.GetContent() 方法是静态的,我通过这样做修复了这个“错误”:

private string ProcessEmailBody(MyRegistrationModel registration)
{
var content = CacheHelper.GetContent("REGISTRATIONEMAIL");

if (content != null)
{
string body = content.Text;
body = body.Replace("@@FULL_NAME@@", registration.FullName);

return body;
}
else return null;
}

而且我终究无法弄清楚为什么这解决了这个问题。任何人都可以阐明这一点吗?

编辑:这是我的 GetContent() 方法(我知道签名与上面不同,我很简短)

public static Content GetContent(string key, int partnerSiteId, int? version, IContentRepository contentRepository, out string cacheKey)
{
cacheKey = string.Format("{0}_{1}_{2}", key, partnerSiteId, version);

var content = CacheManager.Get(cacheKey, () => contentRepository.GetContent(key, partnerSiteId, version), WebConfig.GetCacheDuration(CacheProfile.Short));

return content;
}

private static DataCache _Cache = null; // DataCache is from AppFabric (Microsoft.ApplicationServer.Caching)

public static T Get<T>(string objectKey, Func<T> reloadItemExpresion, TimeSpan cacheDuration) where T : class
{
if (_Cache == null)
{
if (reloadItemExpresion != null)
{
return reloadItemExpresion.Invoke();
}

return null;
}

object cachedObject = null;

try
{
cachedObject = _Cache.Get(objectKey);
}
catch (Exception ex)
{
if (ex is FileNotFoundException)
{
_Cache.Remove(objectKey);
}
}

if (cachedObject != null)
{
return cachedObject as T;
}

if (reloadItemExpresion != null && cacheDuration > TimeSpan.Zero)
{
T item = reloadItemExpresion.Invoke();

if (item != null)
{
Insert(item, objectKey, cacheDuration);
}

return item;
}

return null;
}

contentRepository.GetContent 只是进入数据库并取回实际内容。

最佳答案

第一次通过您将 context.Text 中的 "@@FULL_NAME@@" 标记替换为第一个用户的详细信息。一旦你这样做了,它就再也不会回到"@@FULL_NAME@@",所以在你的缓存被重置之前每个人都会得到那个家伙的详细信息。您应该避免修改从缓存中获取的对象:

private string ProcessEmailBody(MyRegistrationModel registration) {
var content = CacheHelper.GetContent("REGISTRATIONEMAIL");
return content != null ? content.Replace("@@FULL_NAME@@", registration.FullName) : null;
}

关于c# - 替换文本字符串时出现奇怪的 C# 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com