2011-12-07 3 views
0

net.tcp 바인딩을 사용하여 WCF 이중을 사용하는 프로젝트를 채팅하고 있습니다. 나는 IIS 7.5에서 빌드했습니다.WCF에서 예기치 않은 오류 연결을 처리하는 방법

그러나 클라이언트 측에서 구현되는 콜백과 관련된 문제가 있습니다. 클라이언트가 연결 끊김 버튼을 눌렀을 때 제대로 작동하지만 클라이언트가 네트워크 연결 끊기, 컴퓨터 종료 등으로 인해 실패했을 경우 서비스가 제대로 작동하지 않습니다. 그것은 서비스도 오류가 보인다.

내 채팅 서비스 인터페이스 :

[ServiceContract(Name="ServiceChat", SessionMode=SessionMode.Required, CallbackContract=typeof(IChatCallback))] 
public interface IChat 
{ 
    [OperationContract] 
    bool Connect(Client client); 

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)] 
    void Disconnect(); 

    [OperationContract(IsInitiating = false)] 
    void Refresh(); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void Whisper(string target, string content); 

    [OperationContract(IsInitiating = false)] 
    Room[] GetRooms(); 

    [OperationContract(IsInitiating = false)] 
    bool CreateRoom(string roomName); 

    [OperationContract(IsInitiating = false)] 
    bool JoinRoom(string roomName); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void LeaveRoom(string roomName); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void SayToRoom(string roomName, string content); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void InviteMember(Client client, string roomName); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void KickMember(Client member, string roomName); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void DisconnectRoom(string roomName); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void DisconnectAllRoom(); 

    [OperationContract(IsOneWay = true, IsInitiating = false)] 
    void SendFile(string target, File file); 
} 

내 서비스 콜백 :

이 예기치 않은 오류를 처리하는 방법
public interface IChatCallback 
{ 
    [OperationContract(IsOneWay=true)] 
    void RefreshClient(List<Client> clients); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveWhisper(Message message); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveRoomMessage(string roomName, Message message); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveNotifyClientConnect(Client joinedClient); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveNotifyClientDisconnect(Client leaver); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveNotifyClientJoinRoom(Client joinedClient, string roomName); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveNotifyClientLeaveRoom(Client leaver, string roomName, bool kicked); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveNotifyClientDisconnectRoom(Client owner, string roomName); 

    [OperationContract(IsOneWay = true)] 
    void ReceiveInvitedMessage(Room room); 

    [OperationContract(IsOneWay = true)] 
    void ReceivedFile(File file); 
} 

?

답변

0

양면 인쇄 서비스에 관해서는 this MSDN article을보십시오. Microsoft에서 경고하는대로 :

서비스 또는 클라이언트가 채널을 닫을 때 이중 모드는 자동으로 감지하지 않습니다. 따라서 서비스가 예기치 않게 종료되면 기본적으로 서비스에 알리지 않거나 클라이언트가 예기치 않게 종료되면 서비스에 알림이 보내지지 않습니다. 클라이언트와 서비스는 자신이 선택한 경우 서로에게 알리기 위해 자체 프로토콜을 구현할 수 있습니다.

데이터를 클라이언트에 다시 보내려고 할 때마다 확인을 구현해야합니다. 서비스가 아직 모르는 상태에서 이미 실패했을 수 있으므로 연결이 항상 모든 전송과 함께 순수하다는 가정을하지 마십시오.