Search code examples
c#serializationservicestackservicestack-text

ServiceStack return custom response when can't deserialize request


I'm using servicestack to handle xml request from client, my client require always send response like that:

<?xml version="1.0" encoding="utf-8"?>
<Response>
<actionCode>01</actionCode>
<errorCode>20450</errorCode>
</Response>

How can I response with this format when can't deserialize request. Thank you.


Solution

  • By default ServiceStack returns a DataContract serialized version of the Response DTO, so if you don't get the desired XML output by returning a DTO in the shape of XML you want, e.g:

    public class Response 
    {
        public string actionCode { get; set; }
        public string errorCode { get; set; }
    }
    

    If you need to control the exact XML response your Services can just return the XML string literal you want, e.g:

    [XmlOnly]
    public object Any(MyRequest request)
    {
        ....
        return @$"<?xml version="1.0" encoding="utf-8"?>
        <Response>
                <actionCode>{actionCode}</actionCode>
                <errorCode>{errorCode}</errorCode>
        </Response>";
    }
    

    Writing a Custom Error Response is highly unrecommended as it will break ServiceStack clients, existing endpoints / formats, etc. But you can force writing a Custom XML Error for Uncaught Exceptions like deserialization errors with something like:

    UncaughtExceptionHandlers.Add((req, res, operationName, ex) =>
    {
        res.ContentType = MimeTypes.Xml;
        res.Write($@"<?xml version=""1.0"" encoding=""utf-8"" ?>
            <Response>
                <actionCode>{ex.Message}</actionCode>
                <errorCode>{ex.GetType().Name}</errorCode>
            </Response>");
        res.EndRequest();
    });