WebHttpBinding,
WebHttpBehavior
etc. (Dateiendung ".svc" zwingend Teil der Service-URL).
public interface IWcfCustomerService
{
Customer GetCustomerById(int id);
List<Customer> GetCustomerByIds(int[] id);
Customer GetCustomerByUserName(string userName);
List<Customer> GetCustomerByUserNames(string[] userNames);
Customer GetCustomerByEmail(string email);
List<Customer> GetCustomerByEmails(string[] emails);
}
public class Customers : IReturn<List<Customer>>
{
public int[] Ids { get; set; }
public string[] UserNames { get; set; }
public string[] Emails { get; set; }
}
ServiceStack: Thoughtfully architected, obscenely fast, thoroughly enjoyable web services for all.
"API First"
Hello ServiceStack!
AppHost
vorgenommen:
public override void Configure(Container container)
{
container.RegisterAutoWired<MyType>();
container.RegisterAutoWiredAs<MyType,IMyType>();
}
IOC Support
Außerdem: ServiceStack JsonServiceClient.js, Silverlight-, Dart- und Message Queueing Clients sowie alles, was XML oder JSON versteht.
Service Clients
Benutzt die Fluent Validation library:
public class RandomNumberRequestValidator
: AbstractValidator<GetRandomNumber>
{
public RandomNumberRequestValidator()
{
RuleFor(r => r.Lowerbound).GreaterThanOrEqualTo(0);
RuleFor(r => r.Upperbound).LessThanOrEqualTo(200);
}
}
Request Validierung
Werden im AppHost
registriert:
//Add a request filter to check if the user has a session initialized
this.RequestFilters.Add((req, res, requestDto) => {
var sessionId = req.GetCookieValue("user-session");
if (sessionId == null)
{
res.ReturnAuthRequired();
}
});
Filter wird ausnahmslos auf jeden Request angewendet.
Accept-Language
Header respektieren, um lokalisierte Antworten liefern
zu können.
public class LanguageRequestFilterAttribute
: RequestFilterAttribute
{
// [...]
public override void Execute(IHttpRequest req, IHttpResponse res,
object requestDto)
{
string acceptLanguageHeader = req.Headers.Get("Accept-Language");
// Parse the header
// [...]
// Set the language
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
}
}
public class LanguageResponseFilterAttribute : ResponseFilterAttribute
{
// [...]
public override void Execute(IHttpRequest req, IHttpResponse res,
object responseDto)
{
if (res.StatusCode != 401)
{
string language = Thread.CurrentThread.
CurrentUICulture.TwoLetterISOLanguageName;
res.AddHeader("Content-Language", language);
res.AddHeader("Vary", "Accept-Language");
}
}
}
[LanguageRequestFilter]
[LanguageResponseFilter(ApplyTo.Get | ApplyTo.Post | ApplyTo.Put)]
public class MyService : Service
{
// [...]
}
[LanguageRequestFilter]
public class MyRequestDto
{
// [...]
}
Filter wird nur für diesen Request angewendet.
Once you're on the 'Stack, you'll never look back.