2013-08-09 4 views
5

Sto cercando di implementare Swagger con Service Stack. Ho installato lo stack di servizio con swagger usando nuget. Le attuali versioni DLL sono riportate per lo più come 3.9.56.0.Swagger con Service Stack non funzionante

Sto cercando di seguire l'esempio fornito a ... https://github.com/ServiceStack/ServiceStack.UseCases/tree/master/SwaggerHelloWorld

e l'instrucstion appaiono abbastanza infallibile ...

Plugins.Add(new ServiceStack.Api.Swagger.SwaggerFeature()); 

va in 'Configura' metodo dopo che ho' Ho installato via nuget (come indicato dalla documentazione), quindi ho aggiunto i tag [ApiMember] e [Api], insieme alle modifiche ai tag [Route] per aggiungere Riassunto e Note

ma quando visito lo ~/swagger-ui/index.html ottengo l'erro r

Please specify the protocol for ../api 

mio api si siede a ~/api, e ho un unico metodo in questo momento (Ciao Mondo), seduto al ~api/Hello/{name} che restituisce JSON e funziona bene.

se si visita ~api viene visualizzato il messaggio Handler for Request not found: con un output di tipo di traccia stack.

Cosa sto sbagliando? Le istruzioni per abilitare lo swagger appaiono davvero semplici e mancano le istruzioni dettagliate, probabilmente perché dovrebbe "funzionare", per favore aiutatemi!

aggiornamento per risolvere Esker ...

Stack trace @ myhost: 54011/api

Handler for Request not found: 


Request.ApplicationPath:/
Request.CurrentExecutionFilePath: /api 
Request.FilePath: /api 
Request.HttpMethod: GET 
Request.MapPath('~'): D:\Starteam\Private\user\web\ServiceStackSwagger\ServiceStackSwagger\ 
Request.Path: /api 
Request.PathInfo: 
Request.ResolvedPathInfo: /api 
Request.PhysicalPath: D:\Starteam\Private\user\web\ServiceStackSwagger\ServiceStackSwagger\api 
Request.PhysicalApplicationPath: D:\Starteam\Private\user\web\ServiceStackSwagger\ServiceStackSwagger\ 
Request.QueryString: 
Request.RawUrl: /api 
Request.Url.AbsoluteUri: http://localhost:54011/api 
Request.Url.AbsolutePath: /api 
Request.Url.Fragment: 
Request.Url.Host: localhost 
Request.Url.LocalPath: /api 
Request.Url.Port: 54011 
Request.Url.Query: 
Request.Url.Scheme: http 
Request.Url.Segments: System.String[] 
App.IsIntegratedPipeline: True 
App.WebHostPhysicalPath: D:\Starteam\Private\user\web\ServiceStackSwagger\ServiceStackSwagger 
App.WebHostRootFileNames: [global.asax,global.asax.cs,helloservice.cs,jquery-1.10.2.js,packages.config,servicestackswagger.csproj,servicestackswagger.csproj.user,web.config,web.debug.config,web.release.config,app_data,app_start,bin,controllers,dto,models,obj,properties,swagger-ui,views] 
App.DefaultHandler: metadata 
App.DebugLastHandlerArgs: GET|/api|D:\Starteam\Private\user\web\ServiceStackSwagger\ServiceStackSwagger\api 

Inoltre, "Si prega di specificare il protocollo 'è un errore di spavalderia, visualizzato sullo schermo in html sotto il già citato' textbox per cambiare la scoperta url'

e le versioni DLL sono 'per lo piu' lo stesso perché ServiceStack.Redis è la versione 3.9.57.0, ma io non sto usando che, cosi 'per lo piu'

Aggiornamento ... La mia soluzione

Avevo bisogno di questo nel mio file web.config all'interno del tag <configuration>, in precedenza non avevo incluso il bit <location path="api">.

<!-- ServiceStack: CustomPath /api --> 
<location path="api"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*"/> 
     </httpHandlers> 
    </system.web> 

    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true"/> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> 
     </handlers> 
    </system.webServer> 
    </location> 

anche ... avevo messo i miei 'percorsi' in quanto tale ...

//INCORRECT 
[Route("/api/Hello/{name}", Summary = @"N031'5 ServiceStackSwagger thingy", Notes = "Some more info in here cause these are notes")]  
    public class Hello : IReturn<HelloResponse> 

ma che pasticciato con la funzionalità di spavalderia, aveva bisogno di essere ...

//CORRECT 
[Route("/Hello/{name}"... 

con il bit "api" RIMOSSO, e ora tutto funziona.

+0

Qual è il valore che avete impostato per 'discoveryUrl' nel window.swaggerUi = new SwaggerUi ....' script 'di inizializzazione nel file index.html? –

+0

Sto usando '../ api', ma ho anche una casella di testo sullo schermo per cambiare quel valore e fare un altro tentativo. @esker – Nnoel

+0

Puoi mostrare la traccia dello stack per quell'errore "Handler for Request not found"? Inoltre, che "Si prega di specificare il protocollo" - come appare esattamente quell'errore, qualche idea su da dove viene questo errore? Sembra che si tratti di un errore Javascript, ecc. –

risposta

2

È necessario comunicare a Swagger l'URL specifico dell'endpoint di ServiceStack Swagger, anziché l'URL di base dei servizi. Questo endpoint si trova a /resources sotto l'URL di base. Quindi, al posto di per il discoveryUrl, utilizzare ../api/resources, in questo modo, nel proprio indice.file html:

window.swaggerUi = new SwaggerUi({ 
    discoveryUrl: '../api/resources', 
    ... 
+0

No, non ha aiutato. "Si prega di specificare il protocollo per ../api/resources" è ora il messaggio. – Nnoel

+0

Ho aggiornato la mia domanda sopra, per favore guarda – Nnoel