Я повторно задал этот вопрос с примерами, представленными на 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), и запрос параметров не выполняется :(
Plugins.RemoveAll(x => x is HtmlFormat);
? - person Pauli Price   schedule 14.10.2013