исключение при изменении входящего сообщения для метода с "не пустым" шаблоном Uri - PullRequest
1 голос
/ 28 сентября 2010

При изменении входящего сообщения для метода веб-службы с помощью 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

"Вы можете использовать Сообщение в качестве параметра только если это был единственный параметр операция "

Так, каковы мои варианты ..

1 Ответ

1 голос
/ 28 сентября 2010

изменен

 request = Message.CreateMessage(request.Version, null, new SimpleMessageBody(sortedXml.ToString()));
            }

до

Message newMessage = null;
                newMessage = Message.CreateMessage(request.Version, null, new SimpleMessageBody(sortedXml.ToString()));

                newMessage.Headers.CopyHeadersFrom(request);
                newMessage.Properties.CopyProperties(request.Properties);
                request = newMessage;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...