Anulación de los valores de fecha y hora no válidos de entrada en servicio web
-
28-09-2019 - |
Pregunta
Actualmente estoy escribiendo un servicio web # C que tiene que coincidir con un WSDL existente, y mi servicio web es llamado por una tercera parte servicio web (Mi servicio web actúa como una devolución de llamada).
Sin embargo estoy siendo pasada valores no válidos, y la tercera parte de servicio web no está dispuesto a cambiar su servicio web.
Me estoy: Las cadenas de tipo '2010-10-24 12:12:13' en el XML como un DateTime, (que no cumple con la especificación ya que tiene que ser '2010-10-24T12: 12 : 13' ) ¿Hay alguna manera de anular la serialización XML de modo que aún coincide con el WSDL, pero acepta "nada"?
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public DateTime createdAt {
get {
return this.createdAt;
}
set {
this.createdAtField = value;
}
}
Solución
Se podría hacer una SoapExtension que modifica el código XML jabón antes de que está siendo deserialized por el marco. Si utiliza WCF y referencia de servicio que se necesita para hacerlo de otra manera. Aquí hay un código que he creado para limpiar un mensaje de hace algún tiempo.
En su aplicación / web.config (esto es para la limpieza de los datos de entrada de un servicio de jabón)
<system.web>
<webServices>
<soapExtensionTypes>
<add type="mAdcOW.SoapCleanerModule.SOAPCleanerExtension, mAdcOW.SoapCleaner" />
</soapExtensionTypes>
</webServices>
</system.web>
y el código que en mi caso elimina caracteres de SOAP ilegales
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();
}
}
}