Переопределение входящих неверных значений даты и времени в веб-сервисе - PullRequest
0 голосов
/ 02 ноября 2010

В настоящее время я пишу веб-сервис на C #, который должен соответствовать существующему wsdl, и мой веб-сервис вызывается сторонним веб-сервисом (мой веб-сервис действует как обратный вызов).

Однако мне передают недопустимые значения, и сторонний веб-сервис не желает менять свой веб-сервис.

Я получаю: строки типа «2010-10-24 12:12:13» в xml как DateTime (что не соответствует спецификации, так как должно быть '2010-10-24T12: 12 : 13' ) Есть ли способ переопределить сериализацию XML, чтобы она по-прежнему соответствовала wsdl, но принимала «что-нибудь»?

 [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public DateTime createdAt {
    get {
        return this.createdAt;
    }
    set {
        this.createdAtField = value;
    }
}

1 Ответ

0 голосов
/ 03 ноября 2010

Вы можете создать SoapExtension, которое модифицирует мыльный xml перед его десериализацией платформой.Если вы используете wcf и сервисную ссылку, вам нужно будет сделать это по-другому.Вот некоторый код, который я создал для очистки сообщения некоторое время назад.

В вашем app / web.config (это для очистки входящих данных из мыльного сервиса)

<system.web>
 <webServices>
  <soapExtensionTypes>
    <add type="mAdcOW.SoapCleanerModule.SOAPCleanerExtension, mAdcOW.SoapCleaner" />
  </soapExtensionTypes>
 </webServices>
</system.web>

икод, который в моем случае удаляет недопустимые символы SOAP

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web.Services.Protocols;

namespace mAdcOW.SoapCleanerModule
{
    [AttributeUsage(AttributeTargets.Method)]
    public class SOAPCleaner : SoapExtensionAttribute
    {
        public override Type ExtensionType
        {
            get { return typeof (SOAPCleanerExtension); }
        }
        public override int Priority { get; set; }
    }

    public class SOAPCleanerExtension : SoapExtension
    {
        private static readonly Regex _reInvalidXmlChars = new Regex(@"&#x[01]?[0123456789ABCDEF];",
                                                                     RegexOptions.Compiled |
                                                                     RegexOptions.CultureInvariant);

        private Stream _originalStream;
        private MemoryStream _processStream;

        public override void Initialize(object initializer)
        {
        }

        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
        {
            return null;
        }

        public override object GetInitializer(Type serviceType)
        {
            return null;
        }

        public override Stream ChainStream(Stream stream)
        {
            _originalStream = stream;
            _processStream = new MemoryStream();
            return _processStream;
        }

        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    {
                        break;
                    }
                case SoapMessageStage.AfterSerialize:
                    {
                        // This is the message we send for our soap call
                        // Just pass our stream unmodified
                        _processStream.Position = 0;
                        Copy(_processStream, _originalStream);
                        break;
                    }
                case SoapMessageStage.BeforeDeserialize:
                    {
                        // This is the message we get back from the webservice
                        CopyAndClean(_originalStream, _processStream);
                        //Copy(_originalStream, _processStream);
                        _processStream.Position = 0;
                        break;
                    }
                case SoapMessageStage.AfterDeserialize:
                    break;
                default:
                    break;
            }
        }

        private void CopyAndClean(Stream from, Stream to)
        {
            TextReader reader = new StreamReader(from);
            TextWriter writer = new StreamWriter(to);
            string msg = reader.ReadToEnd();
            string cleanMsg = _reInvalidXmlChars.Replace(msg, "");
            writer.WriteLine(cleanMsg);
            writer.Flush();
        }

        private void Copy(Stream from, Stream to)
        {
            TextReader reader = new StreamReader(from);
            TextWriter writer = new StreamWriter(to);
            writer.WriteLine(reader.ReadToEnd());
            writer.Flush();
        }
    }
}
...