我使用asmx文件创建了一个小型Web服务方法。这是它的简化版本。
<WebMethod()> _
Public function DeleteFile(Byval fileID As String) as boolean
DeleteFileByID(fileID)
return true
End Sub
它工作得很好,但我想确保发送回客户端的数据不会在此过程中丢失。
我知道这可以通过设置第二个Web服务方法来完成,该方法将由客户端调用以确认他收到了一些数据。但是,我想知道是否可以在单一Web服务方法中完成此操作。
以下是我可能要寻找的一个例子:
<WebMethod()> _
Public function DeleteFile(Byval fileID As String) as boolean
return true
clientAcknowledgement = 'This is what I'm loking for... How to make sure the client received the confiormation before deleting the file
if clientAcknowledgement then
DeleteFileByID(fileID)
end if
End Sub
答案 0 :(得分:2)
我会通过向调用者可以设置的Web方法调用添加一个参数来解决这个问题。
<WebMethod()> _
Public Function DeleteFile(ByVal fileID As String, clientAcknowledgement As Boolean) As Boolean
If clientAcknowledgement Then
DeleteFileByID(fileID)
End If
End Function
如果调用此方法的开发人员是懒惰的,并且只是在没有提示最终用户的情况下将其设置为true,那么他们有责任回答他们的用户。
你可能会因为调用一种方法然后调用另一种方法而变得非常复杂,但是在一天结束时,使用Web服务的开发人员可以绕过你所放置的任何内容并且你没有真正保证最终用户除非您自己实施代码,否则会被问到。
<强>更新强>
在澄清希望知道调用者在实际删除文件之前收到响应之后,我还有一些额外的想法。
我没有简单的方法来确保在执行实际删除之前已成功将Web服务响应传递给客户端。
但是,有几种选择:
选项A:添加一个DeleteRequested方法,该方法将一个令牌发送给调用者,然后他们必须返回到DeleteFile方法。如果令牌有效,您只能执行删除操作。这里仍有时间问题,但它比目前的实施稍好一些。
选项B:实施通过ASHX页面公开的IHttpHandler。由于您负责在此方案中发送响应,因此您将知道它是否已成功完成传输(即客户端已断开连接),因此您可以等待执行删除直到响应完成。这确实会改变客户端调用和响应您服务的方式,但确实会为您提供所需的验证。
答案 1 :(得分:1)
尝试稍微阅读这些内容,我发现海报的问题可能真的是如果在任何一系列操作(使用Web服务调用调用),数据库或一组中出现问题文件(或两者)可能会处于不一致状态。
在这种情况下,我会建议使用交易。
关于交易的一个很好的起点是MSDN文章Distributed Transactions in Visual Basic .NET。
各种各样的事情都可能出错 - 使用海报的例子 - 删除文件,而不仅仅是缺少SOAP确认。交易的想法是,如果任何出错,那么交易中所做的所有更改都会被撤消。 HTH