Question

Je comprends que WCF convertira une exception en défaut et le renvoyer sous forme de message SOAP, mais je me demandais si cela est vraiment interopérable. Je suppose que je vais avoir un moment difficile essayer de comprendre ce scénario possible:

  1. Client (Java) appelle un service WCF (LoginService).
  2. serveur vérifie autorisation, l'autorisation de l'utilisateur échoue.
  3. serveur renvoie une UnauthorizedAccessException.
  4. WCF convertit en une faute en quelque sorte. (* - Voir ci-dessous aussi)
  5. Client doit être en mesure de savoir lire cette erreur.

Je suppose que je suis juste d'avoir une compréhension moment difficile comment cela pourrait encore être interopérable parce qu'il attend Java de savoir comment traduire une erreur SOAP .NET encode à partir d'un UnauthorizedAccessException.

  • En outre, comment .NET convertir en fait l'exception d'une faute, ce qui se passe en tant que code de défaut, le nom, etc. Certaines des choses semblent être « duh » s aiment peut-être le nom de défaut est « UnauthorizedAccessException », mais je préfère savoir à coup sûr que deviner.
Était-ce utile?

La solution

Il n'y a pas de "conversion automatique". WCF renvoie une faute (j'oublie que l'on) lorsque vous avez une exception non gérée. Mais puisque vous n'avez pas fait cette faute, beaucoup, sinon la plupart, les clients échouera si vous le retourner.

vous êtes censé définir vos propres défauts et de les retourner à la place. Considérez:

[DataContract]
public class MySpecialFault
{
    public string MyMessage { get; set; }
}

[ServiceContract]
public interface IMyService
{
    [FaultContract(typeof (MySpecialFault))]
    [OperationContract]
    void MyOperation();
}

public class MyService : IMyService
{
    public void MyOperation()
    {
        try
        {
            // Do something interesting
        }
        catch (SomeExpectedException ex)
        {
            throw new FaultException<MySpecialFault>(
                new MySpecialFault {MyMessage = String.Format("Sorry, but {0}", ex.Message)});
        }
    }
}

Tout client capable de traiter les défauts traitera de ce sujet. Le WSDL définira la faute, et ils verront un défaut avec l'élément Détail contenant une version sérialisée de l'instance de MySpecialFault qui a été envoyé. Ils seront en mesure de lire toutes les propriétés de cette instance.

Autres conseils

Les défauts font partie de la spécification SOAP depuis version 1.1. Ils sont expliqués dans le SOAP Spécification .

Il appartient aux implémentations (WCF, Java, etc.) afin d'assurer que les défauts sont traitées conformément à la spécification.

Depuis WCF convertit FaultExceptions à des défauts conformément à la spécification SOAP, FaultExceptions jetés à partir de WCF sont interopérables.

défauts SOAP sont interopérables mais les classes d'exception .Net ne sont pas bonnes à utiliser dans les fautes SOAP. définir la place de votre propre classe DataContract (par exemple AccessFault), puis l'utiliser dans un FaultContract. voir http://msdn.microsoft.com/en-us/library/ms733841. aspx

Chaque fois qu'il ya un UnauthorizedAccessException jeté à convertir la limite de service à FaultException. Cela peut se faire de plusieurs façons comme l'utilisation de Microsoft Enterprise Library Gestion des exceptions bloc ou la mise en œuvre de l'interface IErrorHandler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top