2011-12-07 31 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によって警告されたように:

サービスまたはクライアントがそのチャネルを閉じると、二重モデルは自動的に検出されません。 サービスが予期せず終了した場合、デフォルトではサービスに通知されません。またはクライアントが突然終了した場合、サービスに通知されません。クライアントとサービスは、独自のプロトコルを実装して、選択した場合に互いに通知することができます。

したがって、データをクライアントに送り返すときはいつでもチェックを実装する必要があります。サービスがまだそれを知らずに既に失敗している可能性があるので、接続がすべての伝送でまだ純粋であるという仮定を決してしないでください。

関連する問題