Bonjour,

J'utilise Swashbuckle en version 5.5.3 pour générer de la doc swagger à partir de la documentation XML générée lors du build par Visual Studio.
Le problème est que la page générée contient chacune des méthodes de mes services en double.
- Une version classique
- Une version rigoureusement identique à la première sauf que l'URL générée contient un segment '{Version}' en plus.

Nom : Supplies.png
Affichages : 10
Taille : 7,3 Ko
Mon objectif est de générer une page sans la deuxième version de mes méthodes.

La documentation est tout à fait classique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
/// Obtention des informations succinctes sur les fournitures
/// </summary>
/// <remarks>
/// Cette méthode permet de récupérer les informations succinctes des fournitures.
/// La restitution s'effectue par pagination.
/// Chaque page contient le nombre de fournitures correspondant à la taille de la page demandée.
/// </remarks>
/// <param name="data">
/// Données décrivant le filtre pour la restitution de la liste des fournitures.
/// </param>
/// <returns>
/// Objet contenant une liste de fournitures
/// </returns>
La configuration de swagger est la suivante (j'ai enlevé tout qui est en commentaire) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public static SwaggerEnabledConfiguration RegisterSwagger(HttpConfiguration config)
{
    return config.EnableSwagger(c =>
    {                
        c.RootUrl(req =>
        {
            return String.Format("{0}://{1}/{2}.{3}", req.RequestUri.Scheme, req.RequestUri.Authority, BaseWebApiDocConfig.SolutionName, BaseWebApiDocConfig.DomainName);
        });
 
        c.SingleApiVersion("v1", String.Format("Domaine {0} de la solution {1}", BaseWebApiDocConfig.DomainName, BaseWebApiDocConfig.SolutionName));
 
        c.OAuth2("oauth2")
            .Description("OAuth2 Client Credentials Grant")
            .Flow("application")
            .TokenUrl(String.Format("{0}/Oauth/token", BaseWebApiDocConfig.Host))
            .Scopes(scopes =>
            {
                    scopes.Add("read", "Read access to protected resources");
                    scopes.Add("write", "Write access to protected resources");
            });
 
        foreach (var xlmDocFile in Directory.EnumerateFiles(string.Format(@"{0}\App_Data\", System.AppDomain.CurrentDomain.BaseDirectory), "XXX.YYY.*.XML", SearchOption.TopDirectoryOnly))
        {
            c.IncludeXmlComments(xlmDocFile);
        }
 
        c.UseFullTypeNameInSchemaIds();
 
        c.OperationFilter<GlobalHeader>();
        c.OperationFilter<OAuth2Requirement>();
        c.OperationFilter<PublishTag>();
 
        c.DocumentFilter<PublishingEngine>();
        c.DocumentFilter<WebApiHost>();
    });
}
 
public static void RegisterSwaggerUI(SwaggerEnabledConfiguration swaggerConfig)
{
    swaggerConfig.EnableSwaggerUi(c =>
    {
        var assembly = typeof(SwaggerConfig).Assembly;
        c.InjectStylesheet(assembly, "XXX.YYY.WebApiDoc.Assets.SwaggerHeader.css");
        c.InjectStylesheet(assembly, "XXX.YYY.WebApiDoc.Assets.search.css");
        c.CustomAsset("index", assembly, "XXX.YYY.WebApiDoc.Assets.webapidoc.html", true);
        c.CustomAsset("logo_small", assembly, "XXX.YYY.WebApiDoc.Assets.logo_cegid_small.png");  
    });
}
La page webapidoc.html ressemble à ceci :
Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<!DOCTYPE html>
<html>
<head>
    <title>XXX YYY Web Services</title>
    <link href='css/reset-css' media='screen' rel='stylesheet' type='text/css' />
    <link href='css/screen-css' media='screen' rel='stylesheet' type='text/css' />
    <link href='css/reset-css' media='print' rel='stylesheet' type='text/css' />
    <link href='css/screen-css' media='print' rel='stylesheet' type='text/css' />
    %(StylesheetIncludes)
    <script src='lib/object-assign-pollyfill-js' type='text/javascript'></script>
    <script src='lib/jquery-1-8-0-min-js' type='text/javascript'></script>
    <script src='lib/jquery-slideto-min-js' type='text/javascript'></script>
    <script src='lib/jquery-wiggle-min-js' type='text/javascript'></script>
    <script src='lib/jquery-ba-bbq-min-js' type='text/javascript'></script>
    <script src='lib/handlebars-4-0-5-js' type='text/javascript'></script>
    <script src='lib/lodash-min-js' type='text/javascript'></script>
    <script src='lib/backbone-min-js' type='text/javascript'></script>
    <script src='swagger-ui-min-js' type='text/javascript'></script>
    <script src='lib/highlight-9-1-0-pack-js' type='text/javascript'></script>
    <script src='lib/highlight-9-1-0-pack_extended-js' type='text/javascript'></script>
    <script src='lib/jsoneditor-min-js' type='text/javascript'></script>
    <script src='lib/marked-js' type='text/javascript'></script>
    <!-- enabling this will enable oauth2 implicit scope support -->
    <script src='lib/swagger-oauth-js' type='text/javascript'></script>

    <script type="text/javascript">
        $(function () {

            // Get Swashbuckle config into JavaScript
            function arrayFrom(configString) {
                return (configString !== "") ? configString.split('|') : [];
            }

            function stringOrNullFrom(configString) {
                return (configString !== "null") ? configString : null;
            }

            var newRootUrl = '%(RootUrl)';

            if(location.protocol == "http:" && newRootUrl.startsWith("https:")) {
                newRootUrl = "http:" + newRootUrl.substring("https:".length, newRootUrl.length);
            }
            else if (location.protocol == "https:" && newRootUrl.startsWith("http:")) {
                newRootUrl = "https:" + newRootUrl.substring("http:".length, newRootUrl.length);
            }

            window.swashbuckleConfig = {
                rootUrl: newRootUrl,
                discoveryPaths: arrayFrom('%(DiscoveryPaths)'),
                booleanValues: arrayFrom('%(BooleanValues)'),
                validatorUrl: stringOrNullFrom('%(ValidatorUrl)'),
                customScripts: arrayFrom('%(CustomScripts)'),
                docExpansion: '%(DocExpansion)',
                //supportedSubmitMethods: arrayFrom('%(SupportedSubmitMethods)'),
                supportedSubmitMethods: arrayFrom('[]'),
                oAuth2Enabled: ('%(OAuth2Enabled)' == 'true'),
                oAuth2ClientId: '%(OAuth2ClientId)',
                oAuth2ClientSecret: '%(OAuth2ClientSecret)',
                oAuth2Realm: '%(OAuth2Realm)',
                oAuth2AppName: '%(OAuth2AppName)',
                oAuth2ScopeSeperator: '%(OAuth2ScopeSeperator)',
                oAuth2AdditionalQueryStringParams: JSON.parse('%(OAuth2AdditionalQueryStringParams)'),
                apiKeyName: '%(ApiKeyName)',
                apiKeyIn: '%(ApiKeyIn)'
            };

            hljs.configure({
                highlightSizeThreshold: 5000
            });

            // Pre load translate...
            if (window.SwaggerTranslator) {
                window.SwaggerTranslator.translate();
            }

            window.swaggerUi = new SwaggerUi({
                url: swashbuckleConfig.rootUrl + "/" + swashbuckleConfig.discoveryPaths[0],
                dom_id: "swagger-ui-container",
                booleanValues: swashbuckleConfig.booleanValues,
                supportedSubmitMethods: swashbuckleConfig.supportedSubmitMethods,
                onComplete: function (swaggerApi, swaggerUi) {
                    if (typeof initOAuth == "function" && swashbuckleConfig.oAuth2Enabled) {
                        initOAuth({
                            clientId: swashbuckleConfig.oAuth2ClientId,
                            clientSecret: swashbuckleConfig.oAuth2ClientSecret,
                            realm: swashbuckleConfig.oAuth2Realm,
                            appName: swashbuckleConfig.oAuth2AppName,
                            scopeSeparator: swashbuckleConfig.oAuth2ScopeSeperator,
                            additionalQueryStringParams: swashbuckleConfig.oAuth2AdditionalQueryStringParams
                        });
                    }

                    if (window.SwaggerTranslator) {
                        window.SwaggerTranslator.translate();
                    }

                    window.swaggerApi = swaggerApi;
                    _.each(swashbuckleConfig.customScripts, function (script) {
                        $.getScript(script);
                    });
                },
                onFailure: function (data) {
                    log("Unable to Load SwaggerUI");
                },
                docExpansion: swashbuckleConfig.docExpansion,
                jsonEditor: false,
                apisSorter: null, // default to server
                defaultModelRendering: 'schema',
                showRequestHeaders: false,
                oauth2RedirectUrl: window.location.href.replace('index', 'o2c-html').split('#')[0]
            });

            if (window.swashbuckleConfig.validatorUrl !== '')
                window.swaggerUi.options.validatorUrl = window.swashbuckleConfig.validatorUrl;

            window.swaggerUi.load();

            function log() {
                if ('console' in window) {
                    console.log.apply(console, arguments);
                }
            }
        });
    </script>

</head>
<body class="swagger-section">
    <div id='header' style="background-color:#5f7890;">
        <div class="swagger-ui-wrap">
            <a id="logo" href="http://swagger.wordnik.com">
                <img height="30" src="logo_small" alt="swagger" class="logo__img">
                <p style="color:white;text-align:right;">Documentation XXX YYY Web Services</p>
            </a>
        </div>
    </div>
    <div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
    <div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>