} // ProcessInteropNode
// appears under "application/service"
private static void ProcessServiceWellKnownNode(ConfigNode node, RemotingXmlConfigFileData configData)
{
String typeName = null;
String assemName = null;
ArrayList contextAttributes = new ArrayList();
String objectURI = null;
WellKnownObjectMode objectMode = WellKnownObjectMode.Singleton;
bool objectModeFound = false;
// examine attributes
foreach (DictionaryEntry entry in node.Attributes)
{
String key = entry.Key.ToString();
switch (key)
{
case "displayName": break; // displayName is ignored (used by config utility for labelling the application)
case "mode":
{
String value = (String)entry.Value;
objectModeFound = true;
if (String.CompareOrdinal(value, "Singleton") == 0)
objectMode = WellKnownObjectMode.Singleton;
else
if (String.CompareOrdinal(value, "SingleCall") == 0)
objectMode = WellKnownObjectMode.SingleCall;
else
objectModeFound = false;
break;
} // case "mode"
case "objectUri": objectURI = (String)entry.Value; break;
case "type":
{
RemotingConfigHandler.ParseType((String)entry.Value, out typeName, out assemName);
break;
} // case "type"
default: break;
} // switch
} // foreach
// examine child nodes
foreach (ConfigNode childNode in node.Children)
{
switch (childNode.Name)
{
case "contextAttribute":
{
contextAttributes.Add(ProcessContextAttributeNode(childNode, configData));
break;
} // case "contextAttribute"
case "lifetime":
{
// <
break;
} // case "lifetime"
default: break;
} // switch
} // foreach child node
// check for errors
if (!objectModeFound)
{
ReportError(
Environment.GetResourceString("Remoting_Config_MissingWellKnownModeAttribute"),
configData);
}
if ((typeName == null) || (assemName == null))
ReportMissingTypeAttributeError(node, "type", configData);
// objectURI defaults to typeName if not specified
if (objectURI == null)
objectURI = typeName + ".soap";
configData.AddServerWellKnownEntry(typeName, assemName, contextAttributes,
objectURI, objectMode);
} // ProcessServiceWellKnownNode