При изменении входящего сообщения для метода веб-службы с помощью URItemplate, которое не является пустым, я получаю следующее исключение.
System.IndexOutOfRangeException: индекс находился за пределами массива. в System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (сообщение-сообщение, параметры Object []) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs (MessageRpc & rpc) в System.ServiceModel.DispatcherRun.pecOp. ServiceModel.Dispatcher.
Так что работает для
[WebInvoke(Method = "POST", UriTemplate = "/")]
и
[WebInvoke(Method = "PUT", UriTemplate = "/")]
но НЕ
[WebInvoke(Method = "PUT", UriTemplate = "/id")]
и НЕ
[WebInvoke(Method = "POST", UriTemplate = "/id ")]
Ниже показано, как я изменяю сообщение. (Я сортирую узлы xml в алфавитном порядке)
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
//get the request as xml
string xml = request.ToString();
if (!string.IsNullOrWhiteSpace(xml))
{
//create a new xml document
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XElement xmlElement = XElement.Load(new XmlNodeReader(doc));
XDocument sortedXml = new XDocument();
XElement root = new XElement(xmlElement.Name);
sortedXml.Add(root);
Sort2(xmlElement, root);
request = Message.CreateMessage(request.Version, null, new SimpleMessageBody(sortedXml.ToString()));
}
return null;
}
public class SimpleMessageBody : BodyWriter
{
string xmlContent;
public SimpleMessageBody(string content)
: base(true)
{
this.xmlContent = content;
}
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
using (StringReader stringReader = new StringReader(xmlContent))
{
using (XmlReader xmlReader = XmlTextReader.Create(stringReader))
{
writer.WriteNode(xmlReader, true);
}
}
}
}
Я прочитал следующее в REstful.net
"Вы можете использовать Сообщение в качестве параметра
только если это был единственный параметр
операция "
Так, каковы мои варианты ..