Come è noto, scrivendo applicazioni con COM+ 1.5 è possibile rendere i propri oggetti di business automaticamente disponibili come web services attivando il flag Use Soap del tab Activation dell'applicazione. Questa mattina però sono incappato in un problema "interessante" ( si fa per dire ) la cui soluzione è arrivata dai gruppi google dopo una ricerca estenuante. Il problema: alcuni componenti non riuscivano a generare correttamente il WSDL, in particolare l'errore era:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.RealSchemaType.Resolve(StringBuilder sb)
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.XMLNamespace.Resolve()
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.Resolve()
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.Generate()
at System.Runtime.Remoting.MetadataServices.MetaData.ConvertTypesToSchemaToStream(ServiceType[] serviceTypes, SdlType sdlType, Stream outputStream)
at System.Runtime.Remoting.MetadataServices.SdlChannelSink.GenerateSdl(SdlType sdlType, IServerResponseChannelSinkStack sinkStack, ITransportHeaders requestHeaders, ITransportHeaders responseHeaders, Stream& outputStream)
at System.Runtime.Remoting.MetadataServices.SdlChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.Http.HttpHandlerTransportSink.HandleRequest(HttpContext context)
at System.Runtime.Remoting.Channels.Http.HttpRemotingHandler.InternalProcessRequest(HttpContext context)
Apparentemente inspiegabile, in quanto l'oggetto che così rispondeva non aveva tipi speciali ( input stringa, output stringa ! ).
Il problema è: l'oggetto in questione implementava un interfaccia ( cosa solita per un oggetto serviced component )
definita nello stesso namespace dell'oggetto implementante.
Se i due namespace coincidono, il generatore di WSDL va in crisi e non funziona !
La soluzione è: cambiare il namespace in cui è definita l'interfaccia.
Un po' strano,ha l'aria di essere un baco. Questo è il post originale che mi ha aperto la strada della salvezza :)
Va detto in aggiunta che, se non si cancellano gli assembly dai temporary ASP.NET file, il workaround non funziona.