当处理 SOAP 消息时,服务器端的调度是根据soap action header 完成的,它指示调度程序应该处理消息的相应方法是什么。
有时肥皂动作为空或无效(java 互操作)。
我认为您最好的选择是实现 IDispatchOperationSelector。这样,您可以覆盖服务器将传入消息分配给操作的默认方式。
在下一个示例中,调度程序将 SOAP 主体内的第一个元素的名称映射到操作名称,消息将被转发到该操作名称以进行处理。
public class DispatchByBodyElementOperationSelector : IDispatchOperationSelector
{
#region fields
private const string c_default = "default";
readonly Dictionary<string, string> m_dispatchDictionary;
#endregion
#region constructor
public DispatchByBodyElementOperationSelector(Dictionary<string, string> dispatchDictionary)
{
m_dispatchDictionary = dispatchDictionary;
Debug.Assert(dispatchDictionary.ContainsKey(c_default), "dispatcher dictionary must contain a default value");
}
#endregion
public string SelectOperation(ref Message message)
{
string operationName = null;
var bodyReader = message.GetReaderAtBodyContents();
var lookupQName = new
XmlQualifiedName(bodyReader.LocalName, bodyReader.NamespaceURI);
// Since when accessing the message body the messageis marked as "read"
// the operation selector creates a copy of the incoming message
message = CommunicationUtilities.CreateMessageCopy(message, bodyReader);
if (m_dispatchDictionary.TryGetValue(lookupQName.Name, out operationName))
{
return operationName;
}
return m_dispatchDictionary[c_default];
}
}