2010-05-04 5 views
3

J'ai un service WCF comme ceci:connexion simple

[ServiceContract(SessionMode=SessionMode.Required)] 
public interface IService 
{ 
    [OperationContract(IsInitiating = true, IsTerminating = false)] 
    void login(string id); 

    [OperationContract(IsInitiating = false, IsTerminating = false)] 
    string getdata(); 
} 



public class Service : IService 
{ 
    public void login(string hashedid) 
    { 
     if (username != "someusername" || password != "somepassword") 
     { 
      // can not get data 
     } 
     else 
     { 
      // can get data 
     } 
    } 

    public string getdata() 
    { 
     return "these are data"; 
    } 
} 

Comment puis-je écrire la connexion de la méthode et de créer l'application cliente? Merci à vous.

+0

login public void (username chaîne, string password) { if (nom d'utilisateur = "someusername" || password = "unMotdepasse"!) { throw new Exception ("nom d'utilisateur inconnu ou mot de passe"); } { autre // peut obtenir des données }} est-ce correct? – hanuman0503

+2

Ceci est correct en termes de deux paramètres, mais lorsque vous appelez getdata() vous ne saurez toujours pas si cette personne s'est authentifiée plus tôt et l'exception que vous lancez ne sera pas renvoyée au client. Vous devez lancer une exception FaultException ou ajouter ServiceDebugBehavior() avec IncludeExceptionDetailInFaults = true aux comportements de votre hôte de service. – flayn

Répondre

7
[ServiceContract(SessionMode=SessionMode.Required)] 
public interface IService 
{ 
    [OperationContract(IsInitiating = true, IsTerminating = false)] 
    void login(string username, string password); 

    [OperationContract(IsInitiating = false, IsTerminating = false)] 
    string getdata(); 
} 



public class Service : IService 
{ 
// todo: make threadsafe! 
    public static List<Guid> authenticated = new List<Guid>(); 

    public void login(string username, string password) 
    { 

     if (username == "correctUsername" || password == "correctPassword") 
     { 
      // user has given correct username/pasword 
      Guid currentSessionId = OperationContext.Current.SessionId; 

     // note: can throw Exception when calling login twice or more, check if item exists first 
      authenticated.Add(currentSessionId); 
     } 


    } 

    public string getdata() 
    { 
     Guid currentSessionId = OperationContext.Current.SessionId; 
     if (List.Contains(currentSessionId) 
     { 
       return "these are data"; 
     } 

     return String.Empty; 
    } 
} 

Vous pouvez identifier une session par l'ID de session en cours. Une fois qu'un utilisateur s'est authentifié correctement, vous pouvez ajouter cette session à la liste des sessions authentifiées.

Mind: Ceci est juste un pseudo-code. L'identifiant de la session devrait être supprimé lorsque la session est cliquée, la liste que j'utilise n'est pas threadsafe, ... Mais j'espère que cela vous aidera à aller dans la bonne direction.

+2

Vous devrez également utiliser une liaison prenant en charge les sessions pour que cela fonctionne. Voir http://msdn.microsoft.com/en-us/library/ms730879.aspx –

+0

Merci à vous tous. J'ai plus de question: si j'ai plus de méthode getmoredata ou getsomedata, je dois d'abord vérifier SessesionID en premier? – hanuman0503

+0

Oui. Chaque fois que vous voulez vous assurer que l'utilisateur est connecté, vous devez vérifier si l'ID de session est dans la liste. – flayn

Questions connexes