Skip to content

Your first webservice explained

Arxisos edited this page Mar 7, 2012 · 8 revisions

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 that ServiceStack recognizes 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:

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]]

Clone this wiki locally