-
Notifications
You must be signed in to change notification settings - Fork 0
Your first webservice explained
Let's look a bit deeper into the Hello World service you created:
As you have seen, the convention for response DTO is {Request DTO Name} + Response. Note, request and response DTO should be in the same namespace if you want ServiceStack to recognize the DTO pair.
To support automatic exception handling, you also need to add a ResponseStatus property to the response DTO:
//Request DTO
public class Hello
{
public string Name { get; set; }
}
//Response DTO
//Follows naming convention
public class HelloResponse
{
public ResponseStatus ResponseStatus { get; set; } //Automatic exception handling
public string Result { get; set; }
}The service implementation you created inherits from IService<>. That's the base interface for all services in ServiceStack.
public class HelloService : IService<Hello>
{
public object Execute(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}There also exists IRestService, but the philosophy for this interface is the same as with IService<T> except that there are specific methods for each HTTP method (GET, POST...). When using IService<T> always the same method will be called, no matter what HTTP method.
ServiceStack provides two base classes which implement these interfaces:
-
ServiceBase implements
IService<T> -
RestServiceBase implements
IRestService<T>.
We highly recommend to use one of these two base classes, because they already provide automatic exception handling and add possibilities to access HTTP specific features - without creating a hard dependency to HTTP, so your services still stay highly-reusable/testable even if you use features HTTP provides!
Here's an example of the Hello World service you created using ServiceBase<>:
public class HelloService : ServiceBase<Hello>
{
public override object Run(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}...and RestServiceBase<>:
public class HelloService : RestServiceBase<Hello>
{
//Called on GET request
public override object OnGet(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
//Called on DELETE request
public override object OnDelete(Hello request) { ... }
}Let's look at the AppHost's Configure method:
public override void Configure(Container container)
{
//register user-defined REST-ful urls
Routes
.Add<Hello>("/hello")
.Add<Hello>("/hello/{Name}");
}To register your custom REST URLs, you can also use the RestService attribute on the request DTO instead of Routes.Add in the AppHost:
//Request DTO
[RestService("/hello")]
[RestService("/hello/{Name}")]
public class Hello
{
public string Name { get; set; }
}Tip:
[RestService("/hello/{Name}")]
only matches:
- /hello/name
where as:
[RestService("/hello/{Name*}")]matches:
- /hello
- /hello/name
- /hello/my/name/is/ServiceStack
- ...
In the Configure method, you can also access the built-in IoC container and set other application-wide configurations. You can find out more about the IoC container in the next wiki page!
Next wikipage: [[The IoC container]]
- 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
- Security
- 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
- Form Hijacking Prevention
- Auto-Mapping
- HTTP Utils
- Virtual File System
- Config API
- Physical Project Structure
- Modularizing Services
- MVC Integration
- Plugins 3. Request logger 4. Swagger API
- Tests
- Other Languages
- Use Cases
- Performance
- How To
- Future