La unidad de pruebas servicestack servicios personalizados de serialización / deserialización

StackOverflow https://stackoverflow.com//questions/9671493

  •  12-12-2019
  •  | 
  •  

Pregunta

Tengo un problema de prueba webservice que tiene su propio de/mecanismo de serialización siempre.

Mi muestra Task de la clase que está siendo utilizado por TaskService:

public class Task
{
    public string TaskName { get; set; }
    public string AuxData { get; set; }

    public static void RegisterCustomSerialization(IAppHost appHost)
    {
        appHost.ContentTypeFilters.Register("application/xml", SerializeTaskToStream, DeserializeTaskFromStream);
    }

    public static void SerializeTaskToStream(IRequestContext requestContext, object response, Stream stream)
    {
        var tasks = response as List<Task>;
        if (tasks != null)
        {
            using (var sw = new StreamWriter(stream))
            {
                if (tasks.Count == 0)
                {
                    sw.WriteLine("<Tasks/>");
                    return;
                }

                sw.WriteLine("<Tasks>");
                foreach (Task task in tasks)
                {
                    if (task != null)
                    {
                        sw.WriteLine("  <Task type=\"new serializer\">");
                        sw.Write("    <TaskName>");
                        sw.Write(task.TaskName);
                        sw.WriteLine("</TaskName>");
                        sw.Write("    <AuxData>");
                        sw.Write(task.AuxData);
                        sw.WriteLine("</AuxData>");
                        sw.WriteLine("  </Task>");
                    }
                }
                sw.WriteLine("</Tasks>");
            }
        }
        else
        {
            var task = response as Task;
            using (var sw = new StreamWriter(stream))
            {
                if (task != null)
                {
                    sw.WriteLine("  <Task type=\"new serializer\">");
                    sw.Write("    <TaskName>");
                    sw.Write(task.TaskName);
                    sw.WriteLine("</TaskName>");
                    sw.Write("    <AuxData>");
                    sw.Write(task.AuxData);
                    sw.WriteLine("</AuxData>");
                    sw.WriteLine("  </Task>");
                }
            }
        }
    }

    public static object DeserializeTaskFromStream(Type type, Stream stream)
    {
        if (stream == null || stream.Length == 0)
            return null; // should throw exception?
        XDocument xdoc = XDocument.Load(stream);
        XElement auxData = xdoc.Root.Element("AuxData");

        return new Task() { AuxData = auxData.Value };
    }


    public override bool Equals(object obj)
    {
        Task task = obj as Task;
        if (task == null)
            return false;
        return TaskName.Equals(task.TaskName);
    }

    public override int GetHashCode()
    {
        return TaskName.GetHashCode();
    }
}

He basado mi serialización / deserialización de código en: http://www.servicestack.net/ServiceStack.Northwind/vcard-format.htm y https://github.com/ServiceStack/ServiceStack.Examples/blob/master/src/ServiceStack.Northwind/ServiceStack.Northwind.ServiceInterface/VCardFormat.cs

Mi base de la clase de prueba es como sigue:

public class SimpleRestTestBase : AppHostBase
{
    public SimpleRestTestBase() : base( "SimpleRestTestBase", typeof(TaskService).Assembly)
    {
        Instance = null;
        Init();
    }

    public override void Configure(Funq.Container container)
    {
        SetConfig(new EndpointHostConfig
        {
            DefaultContentType = ContentType.Xml
        }
        );

        Task.RegisterCustomSerialization(this);

        Routes
          .Add<Task>("/tasks/{TaskName}")
          .Add<List<Task>>("/tasks");

        container.Register(new List<Task>());
    }
}

Y la prueba de la unidad que falla:

[TestFixture]
public class SimpleTest : SimpleRestTestBase
{
    [Test]
    public void TestMetodRequiringServer()
    {
        var client = (IRestClient)new XmlServiceClient("http://localhost:53967");
        var data = client.Get<List<Task>>("/api/tasks");
    }
}

La excepción que tengo cuando uso nUnit test runner es:

Testing.SimpleTest.TestMetodRequiringServer: System.Runtime.Serialization.SerializationException : Error in line 1 position 9. Expecting element 'ArrayOfTask' from namespace 'http://schemas.datacontract.org/2004/07/ServiceStackMVC'.. Encountered 'Element' with name 'Tasks', namespace ''.

¿Cómo puedo pasar información sobre mi serialización personalizada/deseialization código para el XmlServiceClient?

¿Fue útil?

Solución

Estás anulando el XML genérico formato de Serialización (application/xml) con una versión personalizada que está fuertemente acoplado a manejar sólo 1 servicio web de salida - es muy raro lo que usted desea, ya que evitará (es decir,pausa) todos los demás servicios de devolver XML.Si desea devolver XML personalizado, solo en lo que respecta a los servicios que necesita devolver un string xml en su lugar.

No se puede cambiar la implementación de XmlServiceClient ya que está fuertemente unido a la Serialización XML/Deserialización que ServiceStack usos.Usted debe utilizar una materia prima de Cliente HTTP para enviar el exacto carga XML que desee.He aquí un ejemplo de envío de crudo XML con .NETO de la solicitud web:https://stackoverflow.com/a/8046734/85785

Desde que está regresando y el envío de XML personalizado que usted desea, también puede anular la Petición de encargo del Cuaderno para el servicio web para que tenga una oportunidad para deserializar la solicitud de cuánto te quiero.

Ver la página de la wiki a continuación algunos ejemplos de cómo hacer esto:

https://github.com/ServiceStack/ServiceStack/wiki/Serialization-deserialization

Nota:volviendo XML personalizado no es la ideal ya que pasa por muchas de las ventajas de ServiceStack del tipo seguro, inteligente y obstinado en la naturaleza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top