1

我使用 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
4

2 回答 2

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 。因为您负责在这种情况下发送响应,您将知道它是否成功完成传输(即客户端断开连接),因此您可以等待执行删除,直到响应完成。这确实改变了客户端调用和响应您的服务的方式,但确实为您提供了所需的验证。

于 2013-07-12T19:29:40.953 回答
1

试着在字里行间读一读,我突然想到,如果在一系列操作(使用 Web 服务调用调用)、数据库或一组文件(或两者)可能会处于不一致的状态。

在这种情况下,我建议使用事务。

关于事务的一个很好的起点是 MSDN 文章Visual Basic .NET 中的分布式事务

各种事情都可能出错 - 使用海报的示例 - 删除文件,而不仅仅是缺少 SOAP 确认。事务的想法是,如果出现任何问题,事务中所做的所有更改都会被撤消。高温高压

于 2013-07-18T11:59:26.253 回答