gpt4 book ai didi

c# - 处理具有相同内容的 HTTP 请求

转载 作者:行者123 更新时间:2023-11-30 18:23:39 24 4
gpt4 key购买 nike

我有一个 WebAPI 项目,它接受来自外部服务的 XML,并将它们插入到 SQL Server 数据库中。外部服务总是发送有关该项目的最新状态,因此给出示例(Id 元素在一个 XML 中始终具有相同的值):

第一篇文章:

<Items>
<Item>
<Id>1</Id>
<Content>AB</Content>
<Other>qwe</Other>
</Item>
<Item>
<Id>1</Id>
<Content>CD</Content>
<Other>qwe</Other>
</Item>
</Items>

第二篇文章:

<Items>
<Item>
<Id>1</Id>
<Content>AB</Content>
<Other>rty</Other>
</Item>
<Item>
<Id>1</Id>
<Content>CD</Content>
<Other>qwe</Other>
</Item>
<Item>
<Id>1</Id>
<Content>FG</Content>
<Other>qwe</Other>
</Item>
</Items>

所以在第一篇文章中,我得到了 2 个项目并将它们插入到数据库中。现在第二个,我看到 AB-qwe 已更改为 AB-rty - 我需要更新此记录; CD-qwe 没有改变——什么都不需要;还有一个新的需要插入。还有一种情况是某个项目不再存在意味着我需要删除它。

为了实现这一点,我正在做的是删除我得到的所有内容并插入最新状态。

    private static void AddOrUpdate(CancellationToken ct, string raw)
{
try
{
var items = Utils.DeserializeObject<Items>(raw);
using (var context = new MyContext())
{
var existingItems = context.Items.Where(r => r.Id == items.First().Id);
foreach (var existing in existingItems)
{
context.Items.Remove(existing);
}
foreach (var item in items.Item)
{
context.Items.Add(new Item
{
//... skipped
});
}
context.SaveChanges();
}
}
catch (Exception ex)
{
// handle
}
}

这种方法对我很有效,但我产生了很多开销,因为实际上这些项目很少改变。大多数时候我得到完全相同的 XML。所以问题是,如果我已经处理了进来的元素,我怎么能理解呢?我的一个想法是从每个对象中获取校验和并将它们维护在某个列表中,因此当对象进入时,获取校验和,查看是否处理了这个对象,如果是,则返回,否则执行此删除-插入循环。这应该比每次都执行数据库例程要快得多。这样做的问题是,当 IIS 应用程序池被回收时,我将丢失我的列表并且必须重新开始。你会如何处理像我这样的情况?

编辑:

我不是将 XML 插入到 Db 中,而是将 XML 反序列化为一个对象,该对象表示实体模型,例如:

[XmlRoot(ElementName = "item")]
public class Item
{
[XmlElement("Id")]
[Index("idx_item_id")]
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long ItemId{ get; set; }

[XmlElement("Content")]
[Index("idx_content_bla")]
public string Content{ get; set; }

[XmlElement("Other")]
public string OtherStuff{ get; set; }
}

最佳答案

您的方法的简单解决方案是某种缓存。例如,您可以使用 memcache

即使在应用程序轮询回收之后,它也会保留数据,而且您可以将此操作分散到更多进程或更多机器上。

关于c# - 处理具有相同内容的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068495/

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