.Net WFC/service Web de gestion des exceptions modèle de conception
J'essaie de venir avec un simple, facile à utiliser modèle de conception pour la gestion des erreurs dans un .net service wcf (en particulier un silverlight permis de service wcf). Si une exception est lancée dans la méthode de service de l'application silverlight va voir un CommunicationException indiquant que "Le serveur distant a retourné une erreur: NotFound --->" et peut-être une trace de la pile en fonction de vos paramètres, ce qui est totalement pas utile parce qu'elle ne vous dit pas l'erreur réelle, et généralement la véritable erreur est de ne pas "NotFound".
À la lecture sur des services web et des services wcf et les exceptions, Vous devez jeter savon/wcf standard exceptions comme FaultException ou SoapException. Donc, pour un service wcf vous avez besoin d'envelopper chaque méthode dans un try catch, catch chaque exception, de l'envelopper dans un FaultException et de la jeter. Au moins, c'est ma compréhension, corrigez-moi si je me trompe.
J'ai donc créé mon modèle de conception:
[ServiceContract(Namespace = "http://MyTest")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataAccess
{
///<summary>
///Error class, handle converting an exception into a FaultException
///</summary>
[DataContractAttribute]
public class Error
{
private string strMessage_m;
private string strStackTrace_m;
public Error(Exception ex)
{
this.strMessage_m = ex.Message;
this.strStackTrace_m = ex.StackTrace;
}
[DataMemberAttribute]
public string Message
{
get { return this.strMessage_m; }
set { this.strMessage_m = value; }
}
[DataMemberAttribute]
public string StackTrace
{
get { return this.strStackTrace_m; }
set { this.strStackTrace_m = value; }
}
//Convert an exception into a FaultException
public static void Throw(Exception ex)
{
if (ex is FaultException)
{
throw ex;
}
else
{
throw new FaultException<Error>(new Error(ex));
}
}
}
[OperationContract]
[FaultContract(typeof(Error))]
public void TestException()
{
try
{
throw new Exception("test");
}
catch (Exception ex)
{
Error.Throw(ex);
}
}
}
Donc, pour faire une longue histoire courte, je ne suis toujours pas arriver le corriger l'erreur dans mon application silverlight. Je inspecter le AsyncCompletedEventArgs.Erreur de l'objet et il contient toujours un CommunicationException objet avec l'erreur générique. M'aider à venir avec une belle conception simple motif pour me permettre de facilement jeter l'exception correcte du service, et facilement l'attraper dans l'application.
OriginalL'auteur Jeremy | 2009-01-14
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de centraliser la gestion des erreurs de votre service WCF au lieu de mettre les try/catch sur chaque méthode. Pour ce faire, vous pouvez mettre en œuvre la IErrorHandler interface:
La
ProvideFault
méthode est appelée à chaque fois que l'un de vosOperationContract
déclenche une exception. Il vous permet de convertir l'exception dans un personnalisé définiFaultContract
et de l'envoyer au client. De cette façon, vous n'avez plus besoin de mettre try/catch dans chaque méthode. Vous pouvez également envoyer un autreFaultContract
en fonction de l'exception levée.Sur le côté client, vous avez besoin attraper
FaultException<DataAccessFaultContract>
chaque fois que vous appelez une méthode sur votre service web.OriginalL'auteur Darin Dimitrov
Ok, j'ai regardé dans le IErrorHandler idée. Je n'avais aucune idée que vous pourriez faire de cette façon, et c'est l'idéal car il vous permet d'éviter d'essayer de captures pour chaque méthode. Pouvez-vous faire cela dans les services web standard de trop? J'ai mis en place la façon suivante:
Service:
OriginalL'auteur Jeremy
Pour les paresseux (comme moi):
OriginalL'auteur user295878