2012-06-25 4 views
1

Quelqu'un peut-il me dire la différence entre les codes de sécurité de transport et de niveau message. Aussi, comment les utiliser. Je reçois l'erreur ci-dessous lorsque j'utilise le mode de sécurité des messages:Modes de sécurité dans le service WCF

<message algorithmSuite="Default" clientCredentialType="UserName"/> 

Exception:

System.ServiceModel.CommunicationObjectFaultedException: L'objet de communication, System.ServiceModel.ChannelFactory`1 ne peut pas être utilisé pour la communication parce qu'il est dans l'état Faulted.

Répondre

3

La sécurité des messages crypte chaque message individuel pour protéger les données sensibles. La sécurité du transport sécurise la connexion réseau de bout en bout pour protéger le trafic réseau.

Utilisez les critères de sécurité de transport suivants pour décider de l'utiliser ou non:

point à point. La sécurité du transport prend en charge la communication point à point et ne prend pas en charge les scénarios intermédiaires ou la transition de protocole.

Diffusion en continu. La sécurité du transport peut prendre en charge des scénarios de données en continu.

Limites de liaison. La sécurité du transport ne fonctionne pas avec wsDualHttpBinding.

Limites d'authentification. La sécurité du transport ne fonctionne pas avec la négociation, le nom d'utilisateur ou l'authentification directe Kerberos.

Utilisez les critères de sécurité des messages suivants pour décider de l'utiliser ou non:

Intermédiaires. La sécurité des messages prend en charge les scénarios avec des intermédiaires ou une transition de protocole.

Flexibilité de chiffrement. La sécurité des messages vous permet de chiffrer une partie du message tout en laissant les autres parties en texte clair.

Limites de liaison. La sécurité des messages ne fonctionne pas avec netNamedPipeBinding. Conversations sécurisées. La conversation sécurisée ne fonctionne qu'avec la sécurité des messages.

Limites d'authentification. La sécurité des messages ne fonctionne pas avec l'authentification de base ou de digestion.

0

L'erreur que vous obtenez n'est probablement pas celle qui est à l'origine de votre problème. Pour voir ce qui se passe vraiment, essayez d'utiliser le proxy de service défini ci-dessous:

public class ServiceProxy<T> : IDisposable where T : class, ICommunicationObject 
{ 
    public ServiceProxy(T client) 
    { 
     Client = client; 
    } 

    public T Client { get; private set; } 

    public void Dispose() 
    { 
     if (Client != null && 
      Client.State != CommunicationState.Closed && 
      Client.State != CommunicationState.Faulted) 
     { 
      Client.Close(); 
     } 
    } 
} 

et de l'utiliser de cette façon:

using (var c = new ServiceProxy<[yourservicetypehere]>(new [yourservicetypehere]())) 
{ 
    try 
    { 
     var rep = c.Client.[yourservicemethodhere](......); 
    } 

    catch (Exception exception) 
    { 
     // Trap exception here to see what is really happening. 
    } 

    finally 
    { 
     c.Client.Close(); 
    } 
} 
Questions connexes