forked from ServiceStack/ServiceStack
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:
- Decorating it inside a
HttpResult
object - Throwing or returning a
HttpError
- Using a Request or Response Filter Attribute like the built-in
[AddHeader]
(or your own) or using a Global Request or Response Filter. - 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);
}
}
...
}