2009-12-21 4 views
2

클라이언트가 일부 서버 쪽 메시지 큐에서 메시지를 받기 위해 사용할 수있는 WCF 서비스가 있다고 가정 해 보겠습니다.WCF WebService - 클라이언트가 응답을 수신했는지 확인할 수있는 방법이 있습니까?

[OperationContract] 
public List<string> GetMessages() 
{ 
    var messages = LoadMessagesFromDb(); 
    var messageText = (from m in messages select m.MessageText).ToArray(); 
    return messageText; 
} 

이 LoadMessagesFromDb()가 바로 모든 잡고 있다고 가정하자 :

ID | MESSAGE_TEXT | SENT 
------------------------ 
1 | Hi!   | N 
2 | A 2nd Msg | N 

이 우리의 서비스를 정의 할 수 있습니다 : 예를 들어, 데이터 테이블에서 이메일 서버 측 큐가 말할 수 SENT = 'N'인 메시지. 따라서 이들을로드 한 다음 모든 텍스트 문자열을 추출하여 반환합니다.

이제 내 문제는 그 메시지를 내 데이터 테이블에서 "보낸 = 'Y'"라고 표시해야한다는 것입니다. 다음과 같이 할 수 있습니다 :

[OperationContract] 
public List<string> GetMessages() 
{ 
    var messages = LoadMessagesFromDb(); 
    var messageText = (from m in messages select m.MessageText).ToArray(); 

    // mark sent 
    foreach(var msg in messages) 
     MarkSentInDb(msg.ID); 

    return messageText; 
} 

그러나 클라이언트로 데이터를 반환 할 때 오류가 발생하면 어떻게됩니까? 연결 문제 또는 WCF 직렬화 문제 일 가능성이 있습니까? 내가 정말로하고 싶은 것은 어떻게 든 클라이언트가 메시지를 성공적으로 받았다는 것을 알 수 있습니다.

[OperationContract] 
public List<Message> GetMessages(); 

[OperationContract] 
public void ConfirmMessagesReceived(List<long> messageIds); 
:

[DataContract] 
public class Message 
{ 
    [DataMember] 
    public long ID { get; set; } 

    [DataMemeber] 
    public string Text { get; set; } 
} 

는 다음 서비스에 대한 제 2의 방법이있다 : 내가 지금 생각할 수있는 유일한 방법은 클라이언트가 항목을 성공적으로 수신 된 것을 나타 내기 위해서 호출 할 수있는 제 2의 방법을 만들 것입니다

그래서 클라이언트는 모든 ID를 다시 보내야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? ASP.NET에서 WCF 대신이 작업을 수행하는 경우 메서드에서 응답 스트림을 열고 데이터를 다시 작성하여 try/catch에서 처리 할 수 ​​있지만 WCF에서 동일한 유연성을 갖고 있지는 않습니다 , 커스텀 메시지 작성자 및 확장자를 만들지 않고 ... 누구든지 클라이언트에게 다시 전송하는 동안 오류가 있는지 어떻게 알 수 있습니까? ws-reliablemessaging이 나에게 어떤 것을 제공합니까?

답변

3

ReliableSessions (WsHttpBinding과 함께 사용 가능)은 전송 수준 오류가 발생했을 때 클라이언트가 메시지를 수신하도록 투명하게 보장합니다. 클라이언트 측에서 직렬화 계층의 오류가 처리되어야합니다.

클라이언트로부터 추가 승인이 필요한 경우 클라이언트에서 서버로 쉽게 통신하기 위해 양방향 서비스 (WsDualHttpBinding 사용) 계약을 구현할 수 있습니다.

+0

감사합니다. Ray. 이미 wsHttpBinding을 사용하고 있으므로 신뢰할 수있는 세션이 나에게 도움이 될 것이라고 생각합니다. 난 그저 비 wcf 클라이언트가 어떻게 그것을 볼 필요가있다. 우리 고객 중 일부는 Java를 사용하고 있으며 VB5에 여전히 있다고 생각합니다. – CodingWithSpike

관련 문제