internal void SetObjectFromSoapData(SerializationInfo info)
{
//SerializationInfoEnumerator e = info.GetEnumerator();
Hashtable keyToNamespaceTable = (Hashtable)info.GetValue("__keyToNamespaceTable", typeof(Hashtable));
ArrayList paramNames = (ArrayList)info.GetValue("__paramNameList", typeof(ArrayList));
SoapFault soapFault = (SoapFault)info.GetValue("__fault", typeof(SoapFault));
if (soapFault != null)
{
ServerFault serverFault = soapFault.Detail as ServerFault;
if (null != serverFault)
{
// Server Fault information
if (serverFault.Exception != null)
fault = serverFault.Exception;
else
{
Type exceptionType = Type.GetType(serverFault.ExceptionType, false, false);
if (exceptionType == null)
{
// Exception type cannot be resolved, use a ServerException
StringBuilder sb = new StringBuilder();
sb.Append("\nException Type: ");
sb.Append(serverFault.ExceptionType);
sb.Append("\n");
sb.Append("Exception Message: ");
sb.Append(serverFault.ExceptionMessage);
sb.Append("\n");
sb.Append(serverFault.StackTrace);
fault = new ServerException(sb.ToString());
}
else
{
// Exception type can be resolved, throw the exception
Object[] args = {serverFault.ExceptionMessage};
fault = (Exception)Activator.CreateInstance(
exceptionType,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance,
null,
args,
null,
null);
}
}
}
else if ((soapFault.Detail != null) && (soapFault.Detail.GetType() == typeof(String)) && (!(((String)soapFault.Detail).Length == 0)))
{
fault = new ServerException((String)soapFault.Detail);
}
else
{
fault = new ServerException(soapFault.FaultString);
}
return;
}
MethodInfo mi = MI as MethodInfo;
int paramNameIndex = 0;
if (mi != null)
{
Type retType = mi.ReturnType;
if (retType != typeof(void))
{
paramNameIndex++;
Object returnValue = info.GetValue((String)paramNames[0], typeof(Object));
if (returnValue is String)
retVal = Message.SoapCoerceArg(returnValue, retType, keyToNamespaceTable);
else
retVal = returnValue;
}
}
// populate the args array
ParameterInfo[] pinfos = _methodCache.Parameters;
Object fUnordered = (InternalProperties == null) ? null : InternalProperties["__UnorderedParams"];
if (fUnordered != null &&
(fUnordered is System.Boolean) &&
(true == (bool)fUnordered))
{
// Unordered
for (int i=paramNameIndex; i<paramNames.Count; i++)
{
String memberName = (String)paramNames[i];
// check for the parameter name
int position = -1;
for (int j=0; j<pinfos.Length; j++)
{
if (memberName.Equals(pinfos[j].Name))
{
position = pinfos[j].Position;
}
}
// no name so check for well known name
if (position == -1)
{
if (!memberName.StartsWith("__param", StringComparison.Ordinal))
{
throw new RemotingException(
Environment.GetResourceString(
"Remoting_Message_BadSerialization"));
}
position = Int32.Parse(memberName.Substring(7), CultureInfo.InvariantCulture);
}
// if still not resolved then throw
if (position >= argCount)
{
throw new RemotingException(
Environment.GetResourceString(
"Remoting_Message_BadSerialization"));
}
// store the arg in the parameter array
if (outArgs == null)
{
outArgs = new Object[argCount];
}
outArgs[position]= Message.SoapCoerceArg(info.GetValue(memberName, typeof(Object)), pinfos[position].ParameterType, keyToNamespaceTable);
}
}
else
{
// ordered
if (argMapper == null) argMapper = new ArgMapper(this, true);
for (int j=paramNameIndex; j<paramNames.Count; j++)
{
String memberName = (String)paramNames[j];
if (outArgs == null)
{
outArgs = new Object[argCount];
}
int position = argMapper.Map[j-paramNameIndex];
outArgs[position] = Message.SoapCoerceArg(info.GetValue(memberName, typeof(Object)), pinfos[position].ParameterType, keyToNamespaceTable);
}
}
} // SetObjectFromSoapData