Как заставить плагин Swagger работать в собственном стеке сервисов

Я повторно задал этот вопрос с примерами, представленными на github, и ссылкой для загрузки Dropbox для всех, кто хочет запустить код самостоятельно: Swagger не работает в автономной службе ServiceStack


У меня была служба JSON для службы servicestack, работающая внутри решения для моего веб-сайта по пути '/ api /, но теперь я хотел бы разделить эту часть стека служб и запустить ее как самостоятельную службу Windows. Моя проблема в том, что я и другие разработчики находим плагин Swagger очень полезным для целей тестирования, но теперь, когда он размещен самостоятельно, кажется, что HTTPHandler настроен только для обработки маршрутов служб, а простой HTML не работает.

Как я могу это исправить?

URL: http://localhost:8081/Swagger-UI/Index.html

Ответ :

Handler for Request not found: 

Request.HttpMethod: GET
Request.HttpMethod: GET
Request.PathInfo: /Swagger-UI/Index.html
Request.QueryString: 
Request.RawUrl: /Swagger-UI/Index.html

Установленные пакеты Nuget:

ServiceStack
ServiceStack.Razor

Обновление для @marfarma

В моем файле app.config нет ничего, связанного с ServiceStack ...

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_service1_V2_SSL" />
        <binding name="BasicHttpBinding_service2_V1_SSL" />
      </basicHttpBinding>
    </bindings>
    <client>
      <!-- bespoke services I'm connecting too -->
    </client>
  </system.serviceModel>
  <appSettings>
     <!-- bespoke app settings -->
  </appSettings>  
</configuration>

Program.cs:

           AppHostHttpListenerBase appHost = new my.HttpApi.myApiServiceHostBase("My Service", "my.ApiService");   


           string listeningURL = "http://localhost:8081/";

            var appSettings = new ServiceStack.Configuration.AppSettings();
            my.HttpApi.FakeProvider.ProductProvider.Init(appSettings);
            my.HttpApi.FakeProvider.UserProvider.Init(appSettings);

#if DEBUG

            try
            {
                appHost.Init();
                appHost.Start(listeningURL);

                Console.WriteLine("Press <CTRL>+C to stop.");
                Thread.Sleep(Timeout.Infinite);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: {0}: {1}", ex.GetType().Name, ex.Message);
                throw;
            }
            finally
            {
                appHost.Stop();
            }

            Console.WriteLine("WinServiceAppHost has finished");

метод настройки:

public override void Configure(Funq.Container container)
        {
            Plugins.RemoveAll(x => x is CsvFormat);
            Plugins.RemoveAll(x => x is HtmlFormat);

            ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

            //register any dependencies your services use, e.g:
            //container.Register<ICacheClient>(new MemoryCacheClient());

            var config = new EndpointHostConfig { DefaultContentType = ContentType.Json, ServiceStackHandlerFactoryPath = "api" };


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

            Dictionary<Type, string[]> serviceRoutes = new Dictionary<Type, string[]>();
            serviceRoutes.Add(typeof(AuthService), new[] { "/auth/user" });


            AuthFeature authFeature = new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new FakeCredentialsAuthProvider() });
            authFeature.IncludeAssignRoleServices = false;
            authFeature.ServiceRoutes = serviceRoutes;                      //specify manual auth routes        

            Plugins.Add(authFeature);

            container.Register<ICacheClient>(new MemoryCacheClient());
            var userRep = new InMemoryAuthRepository();
            container.Register<IUserAuthRepository>(userRep);

            Plugins.Add(new CorsFeature(allowedOrigins: "*",
                        allowedMethods: "GET, POST, OPTIONS",
                        //allowedHeaders: "Content-Type",
                        allowedHeaders : "Origin, X-Atmosphere-tracking-id, X-Atmosphere-Framework, X-Cache-Date, Content-Type, X-Atmosphere-Transport,  *",
                        allowCredentials: false));
}

Обновление 2:

1.) Удалены разделы плагинов выше, удаляющие html и csv.

2.) Выполните следующее в диспетчере пакетов (nuget):

Install-Package ServiceStack.Api.Swagger

по-прежнему обработчик не найден.

Совет в этом вопросе (ServiceStack: No /swagger-ui/index.html), на который указала мне марфарма, предполагает, что я могу не должны присутствовать html и javascript 'swagger-ui'. Да.

Похоже, что самообслуживаемый сервисный стек только «обрабатывает» указанные маршруты, и когда я прошу самодостаточный сервис доставить swagger html и javascript, я получаю сообщение об ошибке «обработчик запроса не найден» выше.

Когда я посещаю адрес / resources в моем собственном сервисе, он показывает ожидаемую страницу и данные (предполагая, что плагин swagger работает правильно), но когда я загружаю html и javascript swagger из файловой системы (не обслуживается 'моей службой) и предоставить ему URL-адрес ресурса, который работает, я получаю сообщение «Невозможно прочитать с сервера. Возможно, у него нет соответствующих настроек источника управления доступом», что, по-видимому, является проблемой CORS, но я 'включил cors в моем сервисе (похоже, проблема с кодом пользовательского интерфейса Swagger), swagger-ui отправляет моей автономной службе запрос, отправленный как OPTIONS (вместо GET или POST), и запрос параметров не выполняется :(


person Ninjanoel    schedule 14.10.2013    source источник
comment
Можете ли вы создать минимальный тестовый пример, который показывает проблему? Используйте пример Hello World в качестве службы с существующей конфигурацией AppHost. Я думаю, что это может быть проблема с конфигурацией AppHost, но без подробностей я могу только предполагать.   -  person Pauli Price    schedule 14.10.2013
comment
Привет @marfarma, я добавил код, который, как мне кажется, может быть применим. мой app.config довольно прост, мой код в основном взят из примеров сайта servicestack. Материал CORS в конце - это моя попытка заставить его работать, может быть, излишний, но он все равно не работает   -  person Ninjanoel    schedule 14.10.2013
comment
Что произойдет, если вы закомментируете строку Plugins.RemoveAll(x => x is HtmlFormat);?   -  person Pauli Price    schedule 14.10.2013
comment
Кроме того, видели ли вы этот вопрос: stackoverflow.com/q/16649066/149060   -  person Pauli Price    schedule 14.10.2013
comment
@marfarma Я обновил свой вопрос, спасибо за вашу помощь   -  person Ninjanoel    schedule 15.10.2013
comment
@marfarma, я снова задал этот вопрос, но на этот раз используя пример кода, представленный на github. stackoverflow .com / questions / 19377691 /.   -  person Ninjanoel    schedule 15.10.2013


Ответы (1)