if (servicetypes.Length == 0) return;
Type maint = servicetypes [0].ObjectType;
- ArrayList services = FindServices (servicetypes);
+ Hashtable dataTypes = new Hashtable ();
+ ArrayList services = new ArrayList ();
+ FindTypes (servicetypes, dataTypes, services);
+
if (services.Count > 0)
maint = ((ServiceType) services[0]).ObjectType;
tw.WriteAttributeString ("xmlns", "soap", MetaData.XmlnsNamespace, MetaData.SoapNamespace);
int nums = 0;
- Hashtable dataTypes = FindDataTypes (servicetypes);
foreach (DictionaryEntry entry in dataTypes)
{
string ns = (string) entry.Key;
foreach (ServiceType st in services)
{
-// if (st.Url == null) continue;
WriteServiceType (tw, st);
}
tw.WriteEndElement ();
tw.WriteStartElement ("port", MetaData.WsdlNamespace);
tw.WriteAttributeString ("name", GetPortName (st.ObjectType));
tw.WriteAttributeString ("binding", "tns:" + GetBindingName (st.ObjectType));
- tw.WriteStartElement ("soap","address", MetaData.SoapNamespace);
- tw.WriteAttributeString ("location", st.Url);
- tw.WriteEndElement ();
+
+ if (st.Url != null)
+ {
+ tw.WriteStartElement ("soap","address", MetaData.SoapNamespace);
+ tw.WriteAttributeString ("location", st.Url);
+ tw.WriteEndElement ();
+ }
+
tw.WriteEndElement ();
}
WriteTypeSuds (tw, type);
SchemaInfo sinfo = (SchemaInfo) dataTypes [GetXmlNamespace (type,null)];
- if (!sinfo.SudsGenerated)
+ if (sinfo != null && !sinfo.SudsGenerated)
{
foreach (Type dt in sinfo.Types)
WriteTypeSuds (tw, dt);
return t.Name + "Binding";
}
- Hashtable FindDataTypes (ServiceType[] servicetypes)
+ void FindTypes (ServiceType[] servicetypes, Hashtable dataTypes, ArrayList services)
{
Hashtable types = new Hashtable ();
+ ArrayList mbrTypes = new ArrayList();
+
foreach (ServiceType st in servicetypes)
- FindDataTypes (st.ObjectType, null, types);
- return types;
+ FindDataTypes (st.ObjectType, null, dataTypes, mbrTypes);
+
+ foreach (Type mbrType in mbrTypes)
+ {
+ ServiceType stFound = null;
+ foreach (ServiceType st in servicetypes)
+ if (mbrType == st.ObjectType) stFound = st;
+
+ if (stFound != null) services.Add (stFound);
+ else services.Add (new ServiceType (mbrType));
+ }
}
- void FindDataTypes (Type t, Type containerType, Hashtable types)
+ void FindDataTypes (Type t, Type containerType, Hashtable types, ArrayList services)
{
if (IsSystemType (t))
{
{
string fns = GetXmlNamespace (fi.FieldType, t);
if (!sinfo.Imports.Contains (fns)) sinfo.Imports.Add (fns);
- FindDataTypes (fi.FieldType, t, types);
+ FindDataTypes (fi.FieldType, t, types, services);
}
}
else
{
+ if (services.Contains (t)) return;
+ services.Add (t);
+
foreach (MethodInfo met in t.GetMethods (BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
ParameterInfo[] pars = met.GetParameters ();
foreach (ParameterInfo par in pars)
- if (!par.ParameterType.IsMarshalByRef)
- FindDataTypes (par.ParameterType, t, types);
+ FindDataTypes (par.ParameterType, t, types, services);
- if (!met.ReturnType.IsMarshalByRef)
- FindDataTypes (met.ReturnType, t, types);
+ FindDataTypes (met.ReturnType, t, types, services);
}
}
}
using System.Runtime.Remoting.Messaging;
using System.IO;
using System.Collections;
+using System.Text;
namespace System.Runtime.Remoting.MetadataServices
{
- public class SdlChannelSink : IServerChannelSink, IChannelSinkBase
+ public class SdlChannelSink : IServerChannelSink, IChannelSinkBase
{
- [MonoTODO]
+ IServerChannelSink _next;
+ IChannelReceiver _channel;
+
public SdlChannelSink()
{
}
- public IServerChannelSink NextChannelSink {
- [MonoTODO]
- get { throw new NotImplementedException(); }
+ internal SdlChannelSink (IChannelReceiver channel, IServerChannelSink next)
+ {
+ _next = next;
+ _channel = channel;
}
- public IDictionary Properties {
- [MonoTODO]
- get { throw new NotImplementedException(); }
+ public IServerChannelSink NextChannelSink
+ {
+ get { return _next; }
+ }
+
+ public IDictionary Properties
+ {
+ get { return null; }
}
- [MonoTODO]
public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack,
object state,
IMessage msg,
ITransportHeaders headers,
Stream stream)
{
- throw new NotImplementedException();
+ throw new NotSupportedException (); // Never called
}
- [MonoTODO]
public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack,
object state,
IMessage msg,
ITransportHeaders headers)
{
- throw new NotImplementedException();
+ return null;
}
- [MonoTODO]
public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
IMessage requestMsg,
ITransportHeaders requestHeaders,
out ITransportHeaders responseHeaders,
out Stream responseStream)
{
- throw new NotImplementedException();
- }
-
- [MonoTODO]
- ~SdlChannelSink()
- {
+ string verb = requestHeaders [CommonTransportKeys.RequestVerb] as string;
+ string uri = (string) requestHeaders [CommonTransportKeys.RequestUri];
+
+ if (verb == "GET" && uri.EndsWith ("?wsdl"))
+ {
+ try
+ {
+ uri = uri.Substring (0, uri.Length - 5);
+ Type type = RemotingServices.GetServerTypeForUri (uri);
+
+ string url = _channel.GetUrlsForUri (uri)[0];
+ ServiceType st = new ServiceType (type, url);
+
+ responseStream = new MemoryStream ();
+ MetaData.ConvertTypesToSchemaToStream (new ServiceType[] {st}, SdlType.Wsdl, responseStream);
+ responseStream.Position = 0;
+ responseMsg = null;
+ responseHeaders = new TransportHeaders ();
+ responseHeaders [CommonTransportKeys.ContentType] = "text/xml";
+ }
+ catch (Exception ex)
+ {
+ responseHeaders = new TransportHeaders ();
+ responseHeaders [CommonTransportKeys.HttpStatusCode] = "500";
+ responseStream = new MemoryStream (Encoding.UTF8.GetBytes (ex.ToString ()));
+ }
+ return ServerProcessing.Complete;
+ }
+ else
+ return _next.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
}
}
}