forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Customize HTTP Responses
baramuse edited this page Feb 22, 2013
·
2 revisions
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.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);
}
}
...
}
- Why ServiceStack?
- What is a message based web service?
- Advantages of message based web services
- Why remote services should use separate DTOs
- Getting Started
- Reference
- Clients
- Formats
- View Engines 4. Razor & Markdown Razor
- Hosts
- Advanced
- Configuration options
- Access HTTP specific features in services
- Logging
- Serialization/deserialization
- Request/response filters
- Filter attributes
- Concurrency Model
- Built-in caching options
- Built-in profiling
- Messaging and Redis
- Form Hijacking Prevention
- Auto-Mapping
- HTTP Utils
- Virtual File System
- Config API
- Physical Project Structure
- Modularizing Services
- Plugins
- Tests
- Other Languages
- Use Cases
- Performance
- How To
- Future