Navigation Menu

Skip to content

Customize HTTP Responses

mythz edited this page Nov 19, 2012 · 1 revision

ServiceStack provides multiple ways to customize your services HTTP response. Each option gives you complete control of the final HTTP Response that's returned by your service:

  1. Decorating it inside a HttpResult object
  2. Throwing or returning a HttpError
  3. Using a Request or Response Filter Attribute like the built-in [AddHeader] (or your own) or using a Global Request or Response Filter.
  4. Modifying output by accessing your services base.Response IHttpResponse API

Here are some code examples below using these different approaches:

public class HelloService : Service
{ 
    public object Get(Hello request) 
    { 
        //1. Returning a custom Response Status and Description with Response DTO body:
        var responseDto = ...;
        return new HttpResult(responseDto, HttpStatusCode.Conflict) {
            StatusDescription = "Computer says no",
        };

        //2. Throw or return a HttpError:
        throw new HttpError(System.Net.HttpStatusCode.Conflict, "SomeErrorCode");

        //3. Modify the Request's IHttpResponse
        base.Response.StatusCode = (int)HttpStatusCode.Redirect;
        base.Response.Headers.AddHeader("Location", "http://path/to/new/uri");
    }

    //4. Using a Request or Response Filter 
    [AddHeader(ContentType = "text/plain")]
    public string Get(Hello request)
    {
        return "Hello, {0}!".Fmt(request.Name);
    }
}

Tip: You can also return a HttpError everywhere in your code and it will behave the same as throwing the http error: return new HttpError(System.Net.HttpStatusCode.Conflict, "SomeErrorCode");

Example 4). uses the in-built AddHeaderAttribute to modify the HTTP Response using a Request Filter attribute. You can also modify all HTTP Service Responses by using a Global Request or Response Filter:

    public class AddHeaderAttribute : RequestFilterAttribute
    {
        public string Name { get; set; }
        public string Value { get; set; }
        
        public AddHeaderAttribute() { }

        public AddHeaderAttribute(string name, string value)
        {
            Name = name;
            Value = value;
        }

        public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
        {
            if (string.IsNullOrEmpty(Name) || string.IsNullOrEmpty(Value)) return;

            if (Name.Equals(HttpHeaders.ContentType, StringComparison.InvariantCultureIgnoreCase))
            {
                res.ContentType = Value;
            }
            else
            {
                res.AddHeader(Name, Value);
            }
        }
    ...
}