2010-02-03 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / System.Runtime.Remoting / System.Runtime.Remoting.Channels / SoapMessageFormatter.cs
index e958e557cdfcb0e354592ebf1feb2af1072e060c..85c71a1c0264c558a0a260a5e401901f2db11e94 100644 (file)
@@ -222,9 +222,18 @@ namespace System.Runtime.Remoting.Channels {
                        headersList.Add(new Header("__Uri", uri));\r
                        headersList.Add(new Header("__MethodName", soapMessage.MethodName));\r
                        string typeNamespace, assemblyName;\r
-                       SoapServices.DecodeXmlNamespaceForClrTypeNamespace(soapMessage.XmlNameSpace, out typeNamespace, out assemblyName);\r
 \r
-                       _serverType = RemotingServices.GetServerTypeForUri(uri);\r
+                       if (!SoapServices.DecodeXmlNamespaceForClrTypeNamespace(soapMessage.XmlNameSpace, out typeNamespace, out assemblyName))\r
+                               throw new RemotingException ("Could not decode SoapMessage");\r
+\r
+                       // Note that we don't need to validate the type in\r
+                       // this place because MethodCall will do it anyway.\r
+\r
+                       if (assemblyName == null) // corlib\r
+                               _serverType = Type.GetType (typeNamespace, true);\r
+                       else\r
+                               _serverType = Type.GetType (typeNamespace + ", " + assemblyName, true);\r
+\r
                        headersList.Add(new Header("__TypeName", _serverType.FullName, false));\r
                        \r
                        if (soapMessage.Headers != null) {\r
@@ -243,7 +252,10 @@ namespace System.Runtime.Remoting.Channels {
                        if (signature == null)\r
                                _methodCallInfo = _serverType.GetMethod(soapMessage.MethodName, bflags); \r
                        else\r
-                               _methodCallInfo = _serverType.GetMethod(soapMessage.MethodName, bflags, null, signature, null); \r
+                               _methodCallInfo = _serverType.GetMethod(soapMessage.MethodName, bflags, null, signature, null);\r
+                               \r
+                       if (_methodCallInfo == null && (soapMessage.MethodName == "FieldSetter" || soapMessage.MethodName == "FieldGetter"))\r
+                               _methodCallInfo = typeof(object).GetMethod (soapMessage.MethodName, bflags);\r
 \r
                        // the *out* parameters aren't serialized\r
                        // have to add them here\r
@@ -377,17 +389,9 @@ namespace System.Runtime.Remoting.Channels {
                        return sf;\r
                }\r
 \r
-               internal void GetInfoFromMethodCallMessage(IMethodCallMessage mcm) {\r
+               internal void GetInfoFromMethodCallMessage (IMethodMessage mcm) {\r
                        _serverType = Type.GetType(mcm.TypeName, true);\r
-                       \r
-                       if (mcm.MethodSignature != null) \r
-                               _methodCallInfo = _serverType.GetMethod(mcm.MethodName, \r
-                                                                                                               BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, \r
-                                                                                                               null, (Type []) mcm.MethodSignature, null);\r
-                       else\r
-                               _methodCallInfo = _serverType.GetMethod(mcm.MethodName, \r
-                                                                                                               BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r
-\r
+                       _methodCallInfo = RemotingServices.GetMethodBaseFromMethodMessage (mcm) as MethodInfo;\r
                        _methodCallParameters = _methodCallInfo.GetParameters();\r
                }       \r
                \r