Buenas,
Estoy intentando publicar un servicio web mediante remoting, para ello utilizo una clase que hereda de MarshalByRefObject. Esta clase únicamente tiene un método, al que como parámetro se le pasa otra clase [Serializable] que he creado. Esta última clase hace implemeta un interface también creada por mí, que contiene unos metodos básicos para tratamiento de objetos.
De forma más clara:
ObjetoRemoto.cs/* Librerias importadas ... */
public class ObjetoRemoto : MarshalByRefObject
{
/* Campos ... */
public override object InitializeLifetimeService()
{
/* Cuerpo ... */
}
public int Metodo(ObjetoSerializable obj)
{
/* Cuerpo ... */
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
ObjetoSerializable.cs/* Librerias importadas ... */
[Serializable]
public class ObjetoSerializable : IMiInterface
{
/* Campos ... */
/* Metodos ... */
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMiInterface.cs/* Librerias importadas ... */
public interface IMiInterface
{
/* Métodos básicos ... */
}
Cuando publico este servicio en el puerto 5000 y con el nombre "Servicio.soap", la comunicación por remoting funciona bien, pero cuando intento generar la clase proxy mediante Soapsuds me da un error de servidor, y cuando pongo en el navegador
http://localhost:5000/Servicio.soap?wsdl me da la siguiente excepción:
System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
at System.Runtime.Remoting.MetadataServices.RealSchemaType.PrintMessageWsdl(TextWriter textWriter, StringBuilder sb, String indent, ArrayList refNames)
at System.Runtime.Remoting.MetadataServices.XMLNamespace.PrintMessageWsdl(TextWriter textWriter, StringBuilder sb, String indent, ArrayList refNames)
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.PrintWsdl()
at System.Runtime.Remoting.MetadataServices.WsdlGenerator.Generate()
at System.Runtime.Remoting.MetadataServices.SUDSGenerator.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.HttpServerTransportSink.ServiceRequest(Object state)
at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()
He comprobado que al no obligar al ObjetoSerializable a implementar el interface IMiInterface no me da ningún problema. Cada uno de estos tres ficheros pertenece a un assembly dirente, y también espacios de nombres diferentes. Mi objetivo es que se genere el WSDL en el primer ejemplo, ya que si el ObjetoSerializable no implementa IMiInterface pierde todas las funcionalidades de tratamiento de objetos que necesito.
¿Esto es un fallo del framework? ¿Tiene solución mi problema?
Gracias de antemano.