31 votes

Est-il possible de servir des pages HTML avec ServiceStack?

Je suis en train d'évaluer ServiceStack pour l'utiliser dans un service Windows afin d'héberger des services REST. Jusqu'à présent, c'est excellent et surpasse largement WCF. Sans oublier que c'est beaucoup plus facile à utiliser.

Les services Windows mentionnés ci-dessus doivent être en mesure de fournir une page HTML simple pour servir de "tableau de bord". ServiceStack serait bien sûr utilisé pour fournir des données json pour le tableau de bord, mais que dire de la fourniture de la page de tableau de bord, ainsi que des images et du js? Serait-ce possible? Je préférerais ne pas héberger une application complète ASP.Net et avoir une limitation stricte selon laquelle IIS ne fonctionnera jamais sur ces serveurs. La scalabilité ne devrait pas non plus être une exigence, puisque seule une machine d'administration unique afficherait le tableau de bord.

55voto

mythz Points 54874

Utilisation uniquement de ServiceStack pour le web et les services web

Soutien à le nouveau moteur de vue Razor de ServiceStack

Une amélioration significative de l'histoire HTML de ServiceStack a été ajoutée dans v3.9.11 dans le paquet nuget ServiceStack.Razor. Avec ce soutien, ServiceStack gradué maintenant vers un framework complet de site web et de services web qui offre un remplacement beaucoup plus simple à WCF, MVC et WebApi.

La documentation complète expliquant la nouvelle histoire HTML de ServiceStack avec le support de Razor est maintenue sur le site de démonstration Razor Rockstars :

La documentation complète expliquant le support de Razor et décrivant ses fonctionnalités est expliquée dans les liens ci-dessus.

Juste un framework de services REST avec un format HTML

Le Type de Contenu HTML a été ajouté à ServiceStack de la même manière que vous vous y attendez d'un vrai framework de services REST, c'est-à-dire que vous pouvez simplement ajouter des vues Razor pour améliorer vos services existants qui ne seront utilisées que lorsque le client demandera le Type de Contenu text/html (sans effet sur les formats enregistrés existants). Par exemple, ce service REST /rockstars peut toujours être consulté dans tous les autres Types de Contenu :

De plus, si vos services ont l'attribut [ClientCanSwapTemplates], le client peut échanger les vues et modèles des pages à l'exécution, par exemple voici la même page ci-dessus avec :

L'adoption naturelle de ServiceStack du format HTML de cette manière, rend trivial le développement d'un ensemble de services qui peuvent servir à la fois le HTML et les clients mobiles et desktop natifs.

D'autres façons de servir du HTML

Avant l'ajout de la prise en charge de Razor, il y a quelques stratégies pour servir des pages HTML avec ServiceStack :

Utiliser une page html statique avec des appels ajax

Si vous faites une requête web pour un fichier existant, il est renvoyé avec le Gestionnaire de Fichiers Statiques. Vous pouvez alors simplement faire des appels json ajax à vos services web pour générer dynamiquement une page.

L'application TODO Backbone dans le Modèle de Démarrage de l'Application Service Windows fonctionne de cette manière. (ainsi que la plupart des autres projets d'exemple dans ServiceStack :-)

Retourner une chaine de caractères

Toute chaîne de caractères retournée par vos services web est directement écrite dans le flux de réponse 'tel quel', vous pouvez donc simplement retourner du html en utilisant votre propre solution de modélisation html.

Voici une liste de autres types de retour possibles dans ServiceStack et comment ils sont traités.

Utilisation de Markdown Razor

Le moteur de vue intégré à ServiceStack est Markdown Razor - qui s'inspire du Razor de MVC mais en utilisant la syntaxe Markdown. Il est très extensible supportant une classe de base personnalisée et des méthodes/utilitaires d'extension.

Une caractéristique intéressante de l'utilisation de Markdown Razor est que le même service web qui renvoie du json, xml, etc peut également être un modèle de vue pour une page html générée dynamiquement à la même URL.

Un exemple de ceci est le service web des catégories dont vous pouvez voir les résultats ici : http://www.servicestack.net/docs/category/Framework

et le même service encore une fois en JSON, XML, etc. Vous pouvez également récupérer la page html partiellement générée (sans le modèle) ainsi que le markdown généré dynamiquement.

La page a été créée en utilisant le DTO/modèle de vue des services web qui a été envoyé à cette vue MarkdownRazor https://raw.github.com/ServiceStack/ServiceStack.Examples/master/src/Docs/Views/Category.md

Si vous avez spécifié une page Markdown Razor pour votre service web, elle est utilisée à la place du Rapport HTML5 JSON par défaut que vous voyez maintenant.

L'ordre de résolution utilisé par ServiceStack pour résoudre le modèle Markdown approprié à utiliser pour le rendu HTML est :

  • Si le service web spécifie un modèle (via une réponse personnalisée IHttpResult.TemplateName) - alors une vue avec ce nom.
  • Une vue avec le même nom que le DTO de réponse, en cherchant d'abord dans /Views puis dans /Views/Shared
  • Une vue avec le même nom que le DTO de requête, en cherchant d'abord dans /Views puis dans /Views/Shared

Héberger ServiceStack sur un /chemincustom

ServiceStack peut être utilisé avec ou sans une application web ASP.NET existante. Si votre application est riche en HTML et légère en services REST, une approche courante est d'héberger ServiceStack sur un /chemincustom (par exemple /api) afin que vous puissiez utiliser ASP.NET pour toute la génération de pages HTML.

Si vous utilisez plutôt ASP.NET MVC, vous devez ignorer la route dans le Global.asax RegisterRoutes() de MVC :

routes.IgnoreRoute ("servicestack/{*pathInfo}");

0 votes

Ceci est une excellente information. Je ne suis pas encore sûr de la direction que je vais prendre, mais en regardant les exemples que vous avez liés, ils semblent tous assez faciles.

0 votes

Un problème intéressant que j'ai remarqué en utilisant la même méthode HTML statique dans le modèle de démarrage du service Windows, est que la requête initiale affiche la page, mais les requêtes suivantes ne se chargent jamais. Le navigateur tourne simplement en rond" et indique qu'il "charge localhost". J'ai essayé cela dans les trois principaux navigateurs avec le même résultat. Des idées sur ce qui pourrait causer cela ?

0 votes

De plus, je vois des messages ObjectDisposedException apparaître dans la fenêtre de sortie lors de la diffusion de pages via un hôte console. Encore une fois, la première requête est bonne, les requêtes suivantes ne passent jamais.

0voto

Baz G Points 84

Si vous essayez cela dans .net core avec la dernière version de ServiceStack(5.8.0) avec une implémentation Kestrel auto-hébergée avec ServiceStack.Kestrel, comme je l'ai fait, la réponse fournie ne fonctionnera pas. Le package Razor n'aime pas cette version de ServiceStack et nécessite des binaires 5.0.0.

Cependant, la page de routage fournit une réponse : https://docs.servicestack.net/routing

Exemple :

[Route("/hello/world","GET")]
public class HelloWorld{}

public class GreetingService : Service {
     public HttpResult Get(HelloWorld request)
        {
            return new HttpResult(VirtualFileSources.GetFile("HelloWorld.html"));
        }
  }

Cela m'a pris beaucoup trop de temps pour découvrir, j'espère donc que cette réponse épargnera à quelqu'un la douleur.

Veuillez noter que cela vous permettra uniquement de renvoyer une page html, et non des pages Razor, comme l'a demandé l'auteur original.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X