当前位置: 首页 > 知识库问答 >
问题:

写入CloudAppendBlob:远程服务器返回错误:(409)冲突

阳福
2023-03-14

我正在试图了解远程服务器返回错误的原因:(409)冲突

我通过获取租约、附加文本和打破租约来给AppendBlob写行,就像这样。错误只是偶尔发生,所以我很好奇什么情况会导致它发生。我的怀疑是,如果多个用户命中该代码执行的endpoint,并且以某种方式同时调用获取租赁,可能会发生一些事情。

// Get the AppendBlob reference
CloudAppendBlob blob = ….

// Acquire a lease on the blob until a call to breaking the lease is made
string leaseId = Guid.NewGuid().ToString();
await blob.AcquireLeaseAsync(null, leaseId);

// Append a new entry to the blob
await blob.AppendTextAsync(
       textToBeAppended,
       Encoding.UTF8,
       new AccessCondition { LeaseId = leaseId },
       new BlobRequestOptions(),
       new OperationContext());

// break the lease on the blob
await blob.BreakLeaseAsync(null);

失败的方法是Microsoft。WindowsAzure.存储。共享。协议。http://http://ProcessExcectedStatusCodeNoExcure.

我从遥测中看到,对blob的PUT调用最初失败,出现409状态代码和上述异常,但在成功调用PUT后立即出现202结果代码。我假设Azure存储正在重试,但是我没有看到它应该附加到的文件中的文本行。

这里是完整的调用堆栈,如果这是有帮助的,我不确定什么是ProcessExcectedStatusCodeNoExcure的含义从这个堆栈跟踪。

微软。WindowsAzure.存储。在微软。WindowsAzure.存储。核心。执行者。执行者。Microsoft.WindowsAzure.存储,版本=9.3.1.0,区域性=中性,PublicKeyToken=31bf3856ad364e35Microsoft。WindowsAzure.存储,版本=9.3.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35: c:\Program Files(x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Execator\Executor.csMicrosoft。WindowsAzure.存储,版本=9.3.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35:50)在Microsoft。WindowsAzure.存储。核心。Util.扩展

内部异常系统。网在Microsoft处理WebException。WindowsAzure。存储果心遗嘱执行人。遗嘱执行人。EndExecuteAsync:在微软。WindowsAzure。存储共享。协议httpresponseparasers。ProcessExpectedStatusCodeNoException(Microsoft.WindowsAzure.Storage,版本=9.3.1.0,区域性=neutral,PublicKeyToken=31bf3856ad364e35Microsoft.WindowsAzure.Storage,版本=9.3.1.0,区域性=neutral,PublicKeyToken=31bf3856ad364e35:c:\ProgramFiles(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\Common\Shared\Protocol\HttpResponsers。常见的微软公司。WindowsAzure。存储,版本=9.3.1.0,区域性=中性,PublicKeyToken=31bf3856ad364e35:54)在Microsoft。WindowsAzure。存储斑点。云团

共有2个答案

皇甫喜
2023-03-14

听起来可能是并发的问题:
如果Blob有活动租约,则打破租约。一旦租约被打破,就不能续约。任何授权的请求都可以破坏租约;请求不需要指定匹配的租约ID。当租约被打破时,租约中断期被允许过去,在此期间,除了中断和释放之外,不能对Blob执行任何租约操作。当成功打破租约时,响应指示可以获得新租约之前的间隔(以秒为单位)。https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob#outcomes-of-use-attempts-on-blobs-by-lease-state

若你们看上面的链接,你们会看到一个关于409如何发生的巨大表格
您可以运行fiddler来获取内部异常的跟踪吗?

严宇
2023-03-14

我想知道为什么需要租赁Blob,然后将文本追加到blob。如果同时有多个编写器,那么您的代码中可能会遇到(409)冲突。

基本上,Blob租赁是为了实现对Blob的独占写入访问,如果要同时追加来自多个写入器的Blob,则不适合使用Blob租赁。

如果从代码中删除AcquireLease和BreakLease操作,您担心什么?老实说,我看不出有什么害处。

 类似资料:
  • 我正在使用Twitter OAuth对用户进行身份验证,并在我的网站上显示用户的推文。 以下是用于API的一些常量: 公共常量字符串请求_令牌=”https://api.twitter.com/oauth/request_token“public const string AUTHORIZE=”https://api.twitter.com/oauth/authorize“public const

  • 我试图从当前上下文中的所有项目中找到一个项目,但我似乎总是收到以下错误消息: 请求失败。远程服务器返回错误:(401)未授权。 首先,我设置了访问交换服务的所有内容: 然后我定义要接收的项目(按ID): 最后但同样重要的是,我尝试在我的物品中搜索这个物品: 这就是我的错误发生的地方。我尝试过各种其他的方法,但无论我做什么,我都会被授权。 有人可以以正确的方式指导我,以解决这个问题吗? 编辑 我收到

  • 首先,我在google和statckoverflow中尝试了很多,但还是失败了。我希望能帮助我。谢谢你。 当从我的WebClient调用WCF服务时,我收到以下错误。 注意2:服务器和Web客户端托管在IIS中。

  • 问题内容: 我正打算实施GCM。我编写了一个测试代码以了解其工作原理,但在响应中不断出现错误400。 我正在用Java(JDK 7)编写。 在这个主题上,我遵循了这一原则。我在那里修改了给定的代码,并将ObjectMapper的用法更改为Gson。 这是我对数据对象的代码: *我在服务器参考中看到,在HTTP协议中,我可以只发送带有registration_ids的消息。(所有其他均为可选) 这是

  • 我有很多不正常的逮捕,但我不明白这怎么可能,因为不明白问题的根源。这是异常逮捕的日志: android.app.远程服务例外: android.app.ActivityThread$H. handleMessage(ActivityThread.java:1881)android.os.Handler.dispatchMessage(Handler.java:105) android.os.Loo

  • 我使用RESTAssured练习web服务。在post请求中,它返回500服务器错误,其中我使用邮差发送请求,没有错误。谁能帮我调试一下这个错误吗?请给点意见。任何帮助都是感激的?提前道谢。 错误消息的状态代码应为<200>,但为<500>。 堆栈跟踪: