2013-06-20 4 views
1

Я создал небольшой метод веб-службы, используя файл asmx. Вот упрощенная версия.Подтверждение клиента мыла

<WebMethod()> _ 
Public function DeleteFile(Byval fileID As String) as boolean 
    DeleteFileByID(fileID) 
    return true 
End Sub 

Он работает очень хорошо, но я хотел бы удостовериться, что данные, отправленные обратно клиенту, не теряются в процессе.

Я знаю, что это можно сделать, установив второй метод веб-службы, который будет вызывать клиент, чтобы подтвердить, что он получил некоторые данные. Тем не менее, я хотел бы знать, можно ли это сделать в методе одиночной веб-службы .

Вот пример того, что я мог бы искать:

 <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

У вас есть возможность использования WCF? Если это так, вы можете посмотреть ответ на [этот вопрос] (http://stackoverflow.com/questions/1940889/wcf-webservice-is-there-a-way-to-determine-that-client-received-response). – Matt

ответ

2

Я бы решить эту проблему путем добавления параметра в вызове метода веб, что абонент может установить.

<WebMethod()> _ 
Public Function DeleteFile(ByVal fileID As String, clientAcknowledgement As Boolean) As Boolean 
    If clientAcknowledgement Then 
     DeleteFileByID(fileID) 
    End If 
End Function 

Если разработчик, который вызывает этот метод ленив и просто устанавливает его истинный все время без запроса конечного пользователя, то их ответственность, чтобы ответить на их пользователь.

Вы можете получить довольно сложный сценарий, чтобы вызвать один метод, а затем другой, но в конце концов разработчик, потребляющий веб-службы, может обойти практически все, что вы положили на место, и у вас нет реальной гарантии того, что конец пользователь был запрошен, если вы не внедрили код самостоятельно.

UPDATE

После уточнения, что желание знать, что абонент получил ответ до фактического удаления файла, у меня есть некоторые дополнительные идеи.

Нет простого способа, которым я знаю, чтобы гарантировать, что ответ веб-служб был успешно доставлен клиенту перед выполнением фактического удаления.

Однако, есть несколько альтернатив:

Вариант А: Добавьте метод DeleteRequested, который посылает маркер вызывающего абонента, что они тогда должны вернуться к методу DeleteFile. Вы должны выполнить только удаление, если токен действителен. Здесь все еще есть вопросы, но это немного лучше, чем текущая реализация.

Вариант B: Внесите IHttpHandler, который открывается через страницу ASHX. Поскольку вы отвечаете за отправку ответа в этом сценарии, вы узнаете, завершили ли он успешную передачу или нет (т. Е. Клиент отключен), поэтому вы можете подождать, чтобы выполнить удаление до завершения ответа. Это изменяет способ, которым клиент звонит и отвечает на ваш сервис, но дает вам подтверждение, которое вы выполняете.

+2

Если вы не хотите удалять файл, зачем вы вызываете метод под названием 'DeleteFile' и передаете этот метод Id файла, который вы не хотите удалять, и ложное логическое значение, которое в основном говорит« Просто шутите, Я действительно не хочу его удалять ». Я думаю, что вопрос связан скорее с подтверждением получения клиентом ответа SOAP. – Matt

+0

Мэтт прав. Реальная проблема здесь заключается в получении клиентом ответа SOAP. –

+0

@Matt: Неясно, что такое OP, и все еще не совсем ясно. Я думал, что они были подотчетны. Добавляя флаг, вы можете записать в журнал транзакций, что вызывающий абонент подтвердил, что они сначала проверили с конечным пользователем, чтобы, если что-то пойдет не так, по дороге вы можете указать на журнал как доказательство того, что вызывающий абонент подтвердил пользователя. Это очень похоже на проверку поля на лицензионном соглашении, что вы соглашаетесь с условиями. Вы, возможно, никогда не прочтете их, но вы все равно проверяете коробку, которая покрывает компанию лицензионным соглашением. –

1

Попытка прочитать между строк немного, мне приходит в голову, что проблема с плакатом действительно может заключаться в том, что если что-то пойдет не так между любой из серии действий (вызванных с использованием вызовов веб-службы), базы данных или набора файлов (или обоих) могут быть оставлены в несогласованном состоянии.

В этом случае я предлагаю использовать транзакцию.

Хорошей отправной точкой для транзакций является статья MSDN Distributed Transactions in Visual Basic .NET.

Всевозможные вещи могут пойти не так, как использовать пример плаката - удаление файла, а не только отсутствие подтверждения SOAP. Идея сделки состоит в том, что если ничего не соответствует действительности, все изменения, сделанные в транзакции, будут отменены. HTH

Смежные вопросы