2016-04-14 15 views
5

हमारे क्यूए और प्रोड वातावरण में जो हमारी रीस्टफुल वेब सेवाओं को चलाते हैं, पोर्ट 80 खुला नहीं है। तो वर्तमान में जब मैं क्यूए में स्वैगर यूआई के लिए प्राप्त करने की कोशिश, मैं यह संदेश प्राप्त और यह सिर्फ लटकी हुई है:स्वाशबकल के साथ पोर्ट 443 का उपयोग करने के लिए मैं स्वैगर यूआई कैसे प्राप्त करूं?

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

मैं स्वैगर कॉन्फ़िगर करने के लिए Swashbuckle उपयोग कर रहा हूँ। मैंने इस लाइन को कॉन्फ़िगरेशन में भी बदल दिया है, लेकिन यह अभी भी काम नहीं करता है।

// 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" }); 

एसएसएल पोर्ट 443 खुला है इसलिए मैं इसे चलाने के लिए स्वैगर यूआई प्राप्त करना चाहता हूं। मैं मैन्युअल https://qa-server/product-catalog-api/swagger/docs/v1 को http://qa-server:80/product-catalog-api/swagger/docs/v1 को बदल सकते हैं और उसके बाद स्वैगर अपने वेब तरीकों सूची जाएगा, लेकिन यह लटका हुआ है जब मैं Try it out! क्लिक करें इस कंसोल से उत्पादन होता है: SCRIPT5: Access is denied. File: swagger-ui-min-js, Line: 10, Column: 4300

संपादित करें:

तो मैं में खुदाई की गई है कुछ और और थोड़ा आगे हो गया है लेकिन अभी भी नहीं जहां मैं बनना चाहता हूं। अगर मैं स्वैगर 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। मुझे लगता है कि जब से मैं स्वाशबकल का उपयोग कर रहा हूं, मुझे index.html को कॉन्फ़िगर करने के लिए इसका उपयोग करना होगा क्योंकि मेरे पास उस कोड में मेरे कोड में कहीं भी नहीं है, इसलिए मुझे लगता है कि स्वाशबकल इसे फ्लाई पर बना रहा है।

मुझे पता चला कि swagger.json पथ बदलते समय मुझे क्या याद आ रही थी। जाहिर है कि वहां पर बंदरगाह संख्या की जरूरत है। तो अगर मैं swagger अनुक्रमणिका पृष्ठ पर नेविगेट करता हूं और https://qa-server:443/product-catalog-api/swagger/docs/v1 होने के लिए मैन्युअल रूप से json फ़ाइल के पथ को मैन्युअल रूप से बदलता है तो सबकुछ ठीक काम करता है। तो अब मुझे लगता है कि मैंने समस्या को अलग कर दिया है कि मैं Swashbuckle का उपयोग करके Swaggers index.html में rootUrl कैसे बदलूं।

संपादित 2

ठीक है, मुझे लगता है कि मैं Swashbuckle ठीक से कॉन्फ़िगर किया है क्योंकि यह हमारे देव सर्वर पर सही ढंग से index.html उत्पन्न करता है, लेकिन इतना क्यूए नहीं मुझे लगता है कि समस्या के बाकी कुछ अंतर करने के लिए नीचे है वातावरण में या मेरा पैकेज qa में ठीक से स्थापित नहीं किया गया था।

देव:

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('{}') 
}; 

क्यूए:

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('{}') 
}; 

संपादित 3

हम एक परीक्षण किया आगे समस्या को अलग करने की। हमारे क्यूए पर्यावरण में हमारे पास ए 10 लोड बैलेंसर है। हम क्या हुआ यह देखने के लिए देव पर्यावरण के लिए एक नया ए 10 खड़ा हुआ, और अब हमारे पास देव में एक ही समस्या है। ए 10 कुछ http हेडर मैनिपुलेशन कर रहा था जिसे हमने यह देखने के लिए हटा दिया कि क्या समस्या थी लेकिन फिर भी वही चीज़ मिल रही थी। मैं सर्वर के सेटअप के तरीके से विश्वास करता हूं, एसएसएल को ए 10 में ऑफलोड किया जा रहा है और वास्तव में मेरे कोड को चलाने वाला बॉक्स http प्राप्त कर रहा है। तो जब स्वाशबकल कोड चलता है, तो यह समस्या के कारण http के तहत चल रहा है। मुझे लगता है कि मुझे हमेशा https होने के लिए मजबूर करने का एक तरीका चाहिए। जब HTTP अनुरोध swagger/docs/v1 या swagger/ui/index करने में आता है

+1

कृपया मेरा उत्तर पर एक नज़र यहाँ है:: मैं Swashbuckle साथ मजबूर कर https के समाधान के साथ GitHub पर इस लेख पाया http://stackoverflow.com/questions/36527586/swagger-multiple -होस्ट्स-इन-ए-जेसन-स्पेक/36542927 # 36542927। आपकी मदद कर सकता है – Sampada

+0

@ सैंपडा जो मुझे समस्या को बेहतर ढंग से समझने में मदद करता है। हालांकि, मुझे अभी भी पता नहीं है कि Swagger's index.html या json फ़ाइल को कैसे बदला जाए। ऐसा लगता है कि स्वाशबकल उन्हें गतिशील रूप से बना रहा है, इसलिए शायद कुछ स्वाशबकल कॉन्फ़िगरेशन है जो मुझे याद आ रही है। अपना जवाब पढ़ने के बाद, मुझे कुछ और जानकारी मिली जो मैं अपने प्रश्न में जोड़ूंगा। धन्यवाद! –

+0

मदद करने के लिए खुशी हुई! हालांकि मुझे swashbuckle के बारे में कोई जानकारी नहीं है। आप सौभाग्यशाली हों। – Sampada

उत्तर

7

मुझे अंततः यह मिला! मुझे समस्या को अलग करने में मदद करने के लिए संपदा और स्ट्रिक 01 का धन्यवाद।

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

IISExpress मामले में कस्टम पोर्ट के मौजूदा मामले में 'message.RequestUri.Authority' का उपयोग करना बेहतर है। – Sergey

1

Swashbuckle आप के लिए स्वैगर प्रलेखन उत्पन्न करता है।यदि आपका अनुरोध https के माध्यम से आता है तो उसके द्वारा जेनरेट किए गए डिफ़ॉल्ट index.html में https://yourdomain:443/yourapiapplication होगा। इसी प्रकार यदि यह http के माध्यम से आता है तो rootUrlhttp://yourdomain:80/yourapiapplication होगा। इस स्थिति को देखते हुए आपकी समस्याओं के लिए प्राथमिक उम्मीदवार कैशिंग है। क्या आपने SwaggerConfig.cs में डिफ़ॉल्ट swagger प्रदाता को ओवरराइड करने के माध्यम से स्वैगर दस्तावेज़ों का कैशिंग सक्षम किया है? या क्या आपके क्यूए पर्यावरण में प्रॉक्सी सर्वर हैं या कैशिंग सेटअप आपके देव में अलग है? एचटीटीपीएस के माध्यम से अपने क्यूए सर्वर के लिए एक नए अनुरोध के माध्यम से प्रलेखन को पुन: उत्पन्न करने के परिणामस्वरूप आपके index.html में सही rootUrl होना चाहिए।

+0

आप प्रॉक्सी सर्वर के बारे में सही हैं। मैं अपने प्रश्न में कुछ और विवरण जोड़ूंगा जो मुझे अभी पता चला है। –

संबंधित मुद्दे