-
Notifications
You must be signed in to change notification settings - Fork 0
Customize HTTP Responses
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);
}
}
...
}
- Why ServiceStack?
- Important role of DTOs
- What is a message based web service?
- Advantages of message based web services
- Why remote services should use separate DTOs
-
Getting Started
-
Designing APIs
-
Reference
-
Clients
-
Formats
-
View Engines 4. Razor & Markdown Razor
-
Hosts
-
Security
-
Advanced
- Configuration options
- Access HTTP specific features in services
- Logging
- Serialization/deserialization
- Request/response filters
- Filter attributes
- Concurrency Model
- Built-in profiling
- Form Hijacking Prevention
- Auto-Mapping
- HTTP Utils
- Dump Utils
- Virtual File System
- Config API
- Physical Project Structure
- Modularizing Services
- MVC Integration
- ServiceStack Integration
- Embedded Native Desktop Apps
- Auto Batched Requests
- Versioning
- Multitenancy
-
Caching
-
HTTP Caching 1. CacheResponse Attribute 2. Cache Aware Clients
-
Auto Query
-
AutoQuery Data 1. AutoQuery Memory 2. AutoQuery Service 3. AutoQuery DynamoDB
-
Server Events
-
Service Gateway
-
Encrypted Messaging
-
Plugins
-
Tests
-
ServiceStackVS
-
Other Languages
-
Amazon Web Services
-
Deployment
-
Install 3rd Party Products
-
Use Cases
-
Performance
-
Other Products
-
Future