2016-04-14 3 views
5

В наших средах QA и Prod, которые управляют нашими веб-службами RESTful, порт 80 не открыт. Так что в настоящее время, когда я пытаюсь добраться до Swagger UI в QA, я получаю это сообщение, и он просто висит:Как получить интерфейс Swagger для использования порта 443 с Swashbuckle?

fetching resource list: http://qa-server:80/product-catalog-api/swagger/docs/v1; Please wait.

Я использую Swashbuckle настроить Swagger. Я также изменил эту строку в конфиге, но она по-прежнему не работает.

// If schemes are not explicitly provided in a Swagger 2.0 document, then the scheme used to access 
// the docs is taken as the default. If your API supports multiple schemes and you want to be explicit 
// about them, you can use the "Schemes" option as shown below. 
// 
c.Schemes(new[] { "https" }); 

Порт SSL 443 открыт, поэтому я хотел бы получить доступ к интерфейсу Swagger. Я могу вручную изменить http://qa-server:80/product-catalog-api/swagger/docs/v1 к https://qa-server/product-catalog-api/swagger/docs/v1, а затем Кураж перечислит свои веб-методов, но зависает, когда я нажимаю Try it out! Это выход из консоли: SCRIPT5: Access is denied. File: swagger-ui-min-js, Line: 10, Column: 4300

EDIT:

Так что я копал в еще кое-что, и получили немного дальше, но все еще не там, где я хочу быть. Если бы я посмотреть на источник файла Кураж index.html, я вижу проблему:

window.swashbuckleConfig = { 
    rootUrl: 'http://qa-server:80/product-catalog-api', 
    discoveryPaths: arrayFrom('swagger/docs/v1'), 
    booleanValues: arrayFrom('true|false'), 
    validatorUrl: stringOrNullFrom('null'), 
    customScripts: arrayFrom(''), 
    docExpansion: 'none', 
    oAuth2Enabled: ('false' == 'true'), 
    oAuth2ClientId: '', 
    oAuth2ClientSecret: '', 
    oAuth2Realm: '', 
    oAuth2AppName: '', 
    oAuth2ScopeSeperator: ' ', 
    oAuth2AdditionalQueryStringParams: JSON.parse('{}') 
}; 

Даже если я перейти на сайт, как HTTPS и схема Swashbuckle установлен протокол HTTPS, он по-прежнему порождающая rootUrl как http. Я думаю, так как я использую Swashbuckle, я должен использовать его для настройки index.html, потому что у меня нет этого файла в любом месте моего кода, поэтому я думаю, что Swashbuckle генерирует его на лету.

Я выяснил, что мне не хватает при изменении пути swagger.json. По-видимому, ему нужен номер порта. Поэтому, если я перейду на страницу индекса swagger и вручную измените путь к json-файлу, который будет https://qa-server:443/product-catalog-api/swagger/docs/v1, все будет хорошо. Итак, теперь я думаю, что я выделил проблему до того, как изменить rootUrl в Swaggers index.html с помощью Swashbuckle.

EDIT 2

Ну, я думаю, что я Swashbuckle настроен правильно, потому что он генерирует index.html правильно на нашем сервере DEV, но не Qa, так что я предполагаю, что остальная часть проблемы до некоторой разницы в средах или моем пакете не были правильно установлены в qa.

DEV:

window.swashbuckleConfig = { 
    rootUrl: 'https://server-dev:443/product-catalog-api', 
    discoveryPaths: arrayFrom('swagger/docs/v1'), 
    booleanValues: arrayFrom('true|false'), 
    validatorUrl: stringOrNullFrom('null'), 
    customScripts: arrayFrom(''), 
    docExpansion: 'none', 
    oAuth2Enabled: ('false' == 'true'), 
    oAuth2ClientId: '', 
    oAuth2ClientSecret: '', 
    oAuth2Realm: '', 
    oAuth2AppName: '', 
    oAuth2ScopeSeperator: ' ', 
    oAuth2AdditionalQueryStringParams: JSON.parse('{}') 
}; 

QA:

window.swashbuckleConfig = { 
    rootUrl: 'http://qa-server:80/product-catalog-api', 
    discoveryPaths: arrayFrom('swagger/docs/v1'), 
    booleanValues: arrayFrom('true|false'), 
    validatorUrl: stringOrNullFrom('null'), 
    customScripts: arrayFrom(''), 
    docExpansion: 'none', 
    oAuth2Enabled: ('false' == 'true'), 
    oAuth2ClientId: '', 
    oAuth2ClientSecret: '', 
    oAuth2Realm: '', 
    oAuth2AppName: '', 
    oAuth2ScopeSeperator: ' ', 
    oAuth2AdditionalQueryStringParams: JSON.parse('{}') 
}; 

EDIT 3

Мы сделали тест, чтобы еще больше изолировать проблему. У нас есть балансировщик нагрузки A10 в нашей среде QA. Мы подняли новый A10 для среды разработчиков, чтобы узнать, что произошло, и теперь у нас такая же проблема в dev. A10 выполнял некоторые манипуляции с заголовками http, которые мы удалили, чтобы увидеть, была ли эта проблема, но все равно получала то же самое. Я верю, что настроены серверы, SSL выгружается на A10, а в поле, на котором работает мой код, попадает http. Поэтому, когда код Swashbuckle работает, он работает под http, вызывая проблему. Я думаю, мне нужен способ заставить его всегда быть https.

+1

Пожалуйста, посмотрите на мой ответ здесь: http://stackoverflow.com/questions/36527586/swagger-multiple -hosts-in-same-json-spec/36542927 # 36542927. Могу вам помочь. – Sampada

+0

@Sampada Это помогает мне лучше понять проблему. Тем не менее, я до сих пор не знаю, как изменить файл index.html или json файла Swagger. Похоже, Swashbuckle создает их динамически, поэтому, вероятно, есть какая-то конфигурация Swashbuckle, которую я пропускаю. Прочитав ваш ответ, я получил дополнительную информацию, которую добавлю к моему вопросу. Благодаря! –

+0

Рад помочь! Однако я понятия не имею о swashbuckle. Удачи тебе. – Sampada

ответ

7

Я, наконец, получил его! Спасибо Sampada и strick01 за то, что помогли мне изолировать проблему. Я нашел эту статью на GitHub с раствором вынуждающих по протоколу HTTPS с Swashbuckle:

https://github.com/domaindrivendev/Swashbuckle/issues/296

config 
    .EnableSwagger("docs/{apiVersion}", 
    c => 
    { 
     ... 
     c.RootUrl(ResolveBasePath); 
     ... 
    }) 
    .EnableSwaggerUi(); 

private static string ResolveBasePath(HttpRequestMessage message) 
{ 
    var virtualPathRoot = message.GetRequestContext().VirtualPathRoot; 

    var schemeAndHost = "https://" + message.RequestUri.Host; 
    return new Uri(new Uri(schemeAndHost, UriKind.Absolute), virtualPathRoot).AbsoluteUri; 
} 
+1

Лучше использовать 'message.RequestUri.Authority' в случае существующего пользовательского порта, например, в случае IISExpress – Sergey

1

Swashbuckle генерирует документацию Swagger для вас, когда HTTP-запрос поступает в swagger/docs/v1 или swagger/ui/index.Если ваш запрос приходит через https, тогда по умолчанию index.html, который он создает, будет содержать rootUrlhttps://yourdomain:443/yourapiapplication. Аналогично, если он поступит через http, тогда rootUrl будет http://yourdomain:80/yourapiapplication. Учитывая эту ситуацию, основным кандидатом на ваши проблемы является кеширование. Включили ли вы кэширование документации Swagger посредством переопределения поставщика swagger по умолчанию в SwaggerConfig.cs? Или в вашей среде QA есть прокси-серверы или настройка кэширования, отличная от той, что у вашего разработчика? Восстановление документации с помощью нового запроса на ваш сервер QA через HTTPS должно привести к правильному rootUrl в вашем index.html.

+0

Вы имеете право про прокси-серверы. Я добавлю несколько подробностей к моему вопросу, которые я только что узнал. –

Смежные вопросы