对已删除的http连接重复处理

时间:2015-11-09 03:04:51

标签: javascript c# asp.net http asp.net-web-api

客户端应用程序创建资源并将其移动到服务器,即一旦客户端从服务器收到HTTP 200,它就会删除本地副本。

简化的控制器操作如下所示:

[HttpPost]
public IHttpActionResult PostResource(MyModel model)
{
    // creates Id
    await _db.Insert(model);

    return Ok(model);
}

有时,当客户端断开连接时(例如在中国,东南亚)资源被持久化到数据库,创建服务器端资源但客户端不知道删除本地副本并再次尝试。正弦HTTP是一种无状态协议,服务器也不知道客户端不再正在侦听。

避免以这种方式创建重复项的好策略是什么?

2 个答案:

答案 0 :(得分:1)

您需要在模型上使用某种身份。有几种可能的策略:

  1. 客户端创建并添加到模型的简单GUID。如果它尝试提交的模型与服务器已经存在的前一个模型具有相同的ID,则会出现错误或类似的错误。这里的诀窍是如何确保客户端始终生成相同的ID,或者将其持久保存在某处。
  2. 某些服务器端根据模型内容(这可能很昂贵)和客户端信息(IP,名称等)生成ID。

答案 1 :(得分:1)

获取资源的哈希值(SHA-256或更高),并将其用作数据库中的唯一键。 Alex Meyer-Gleaves撰写了关于compute any hash for any object in c#

的文章

如果哈希已经存在,请不要插入。这使您的POST idempotent