Bonjour,
Je ne sais pas si je dois poster dans Services Web ou ASP.NET...
J'ai un web service, déjà développé avec mes petites mimines et qui globalement fonctionne. C'est mon premier web service et j'ai déjà remarqués quelques erreurs de débutante (gestion des pool de connexion à la base de donnée) et on a les corrigé. à terme il est prévu migrer vers un truc plus propre, mais toujours en asmx.
C'est un web service appelé par du code BizTalk uniquement. Il est développé dans un visual 2005 et c'est du .Net 2.0 sous forme .asmx.
Le problème c'est qu'il ne retourne pas de messages d'erreurs quand il y a un problème de mapping nhibernate. L'autre jour, on a étendu l'utilisation de notre interface et il y avait des données manquantes en table et j'ai mis 1000 ans à trouver la cause car pas de gestion d'erreurs
Dans ces cas d'erreurs, via internet explorer on obtient :
Et quand elle est récupéré par BizTalk, ça donne ça :Erreur du serveur dans l'application '/WebServicesIHEPAM'.
--------------------------------------------------------------------------------
Le format demand n'est pas reconnu pour l'URL se terminant par '/GetInformationPatient'.
Description : Une exception non gre s'est produite au moment de l'excution de la demande Web actuelle. Contrlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Dtails de l'exception: System.InvalidOperationException: Le format demand n'est pas reconnu pour l'URL se terminant par '/GetInformationPatient'.
Erreur source:
Une exception non gre s'est produite lors de l'excution de la demande Web actuelle. Les informations relatives l'origine et l'emplacement de l'exception peuvent tre identifies en utilisant la trace de la pile d'exception ci-dessous.
Trace de la pile:
[InvalidOperationException: Le format demand n'est pas reconnu pour l'URL se terminant par '/GetInformationPatient'.]
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +405881
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +212
System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +193
System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +93
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
--------------------------------------------------------------------------------
Informations sur la version : Version Microsoft .NET Framework :2.0.50727.3053; Version ASP.NET :2.0.50727.3053
Donc j'aimerais gérer les erreurs !Une SOAP Fault a été reçue suite à une récupération de données liée au patient. Description de l'erreur : Server was unable to process request. ---> Object reference not set to an instance of an object.
J'ai regardé un peu la doc et vu qu'il fallait entourer son code de try catch et throw une soapException.
Je l'ai testé en prenant l'exemple tout con donnée par cette page : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
J'ai essayé en laissant mon code ou en envoyant systématiquement la soapException mais c'est toujours la même erreur 500.
Du coup j'ai essayé en rajoutant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 [WebMethod] public DTO.IHEPAM.Transport.Patient GetInformationPatient(String idPatient, String niveauChargementPatient) { _log = log4net.LogManager.GetLogger(typeof(WSPAM)); _log.Info("WSPAM.GetPatient.Start"); DTO.IHEPAM.Transport.Patient pat; //try //{ // BLL.Patient.GetPatient Patient = new BLL.Patient.GetPatient(); // pat = Patient.GetDossier(idPatient); //} //catch (Exception e){ // Build the detail element of the SOAP fault. System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); System.Xml.XmlNode node = doc.CreateNode(XmlNodeType.Element, SoapException.DetailElementName.Name, SoapException.DetailElementName.Namespace); // Build specific details for the SoapException. // Add first child of detail XML element. System.Xml.XmlNode details = doc.CreateNode(XmlNodeType.Element, "mySpecialInfo1", "http://tempuri.org/"); System.Xml.XmlNode detailsChild = doc.CreateNode(XmlNodeType.Element, "childOfSpecialInfo", "http://tempuri.org/"); details.AppendChild(detailsChild); // Add second child of detail XML element with an attribute. System.Xml.XmlNode details2 = doc.CreateNode(XmlNodeType.Element, "mySpecialInfo2", "http://tempuri.org/"); XmlAttribute attr = doc.CreateAttribute("t", "attrName", "http://tempuri.org/"); attr.Value = "attrValue"; details2.Attributes.Append(attr); // Append the two child elements to the detail node. node.AppendChild(details); node.AppendChild(details2); //Throw the exception SoapException se = new SoapException("Fault occurred", SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri, node); throw se; //} return pat; }dans mon web.config <system.web> , mais ça ne change rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> <add name="HttpSoap"/> </protocols> </webServices>
Sinon l'erreur que j'avais mis 1000 ans à trouver est dû à undans un des fichier hbm.xml du mapping nHibernate. C'est du vieux NHibernate version 2 je crois...
Code : Sélectionner tout - Visualiser dans une fenêtre à part <property name="LibelleComite" formula=" ( SELECT ENTITE.LIBSCE FROM ENTITE WHERE trim(ENTITE.CODSCE) = Comite ) " type="String" />
Je me dit que c'est peut-être un problème de config de IIS...
Des idées ?
J'aimerais bien récupérer des erreurs parlantes qui me dit que c'est un problème de mapping nhibernate
Merciii
Partager