2016-12-02 14 views
6

हमारे पास asp.net कोर webapi है। हमने Microsoft.AspNetCore.Mvc.Versioning और Swashbuckle को swagger UI जोड़ने के लिए जोड़ा। हम इस रूप में नियंत्रक निर्दिष्ट:Swashbuckle बनाम माइक्रोसॉफ्ट को स्थापित करने के लिए कैसे करें। ASPNetCore.Mvc.Versioning

[ApiVersion("1.0")] 
[Route("api/v{version:apiVersion}/[controller]")] 
public class ContactController : Controller 
{ 

जब हम अकड़ ui चलाने हम मार्गों में पैरामीटर के रूप में संस्करण प्राप्त: enter image description here

सेट अप कैसे डिफ़ॉल्ट "वी 1" मार्ग के लिए? यदि संस्करण 2 मंच पर आते हैं तो दोनों संस्करणों के लिए कैसे swagger ui का समर्थन करते हैं?

+0

किसी ने इस बारे में विशेष रूप से एक Github मुद्दा खोला, और जबकि यह अभी भी 7 जनवरी 2017 के रूप में खुला है, टिप्पणियाँ एक समाधान है कि मेरे लिए काम कर रहा है: https: // GitHub। com/domaindrivendev/Swashbuckle.AspNetCore/मुद्दों/244 –

उत्तर

2

फिलहाल स्वाशबकल और माइक्रोसॉफ्ट.एस्पनेट कॉर.एमवीसी वर्जनिंग दोस्त हैं। यह अच्छा काम करता है। मैंने अभी वीएस2017 में टेस्ट प्रोजेक्ट बनाया है और यह जांच की है कि यह कैसे काम करता है।

सबसे पहले इन दोनों nuget संकुल में शामिल हैं:

<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="1.2.1" /> 
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0" /> 
Startup.cs में

कॉन्फ़िगर सब कुछ (मेरी टिप्पणी पढ़ने के लिए):

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 


     // Configure versions 
     services.AddApiVersioning(o => 
     { 
      o.AssumeDefaultVersionWhenUnspecified = true; 
      o.DefaultApiVersion = new ApiVersion(1, 0); 
     }); 

     // Configure swagger 
     services.AddSwaggerGen(options => 
     { 
      // Specify two versions 
      options.SwaggerDoc("v1", 
       new Info() 
       { 
        Version = "v1", 
        Title = "v1 API", 
        Description = "v1 API Description", 
        TermsOfService = "Terms of usage v1" 
       }); 

      options.SwaggerDoc("v2", 
       new Info() 
       { 
        Version = "v2", 
        Title = "v2 API", 
        Description = "v2 API Description", 
        TermsOfService = "Terms of usage v2" 
       }); 

      // This call remove version from parameter, without it we will have version as parameter 
      // for all endpoints in swagger UI 
      options.OperationFilter<RemoveVersionFromParameter>(); 

      // This make replacement of v{version:apiVersion} to real version of corresponding swagger doc. 
      options.DocumentFilter<ReplaceVersionWithExactValueInPath>(); 

      // This on used to exclude endpoint mapped to not specified in swagger version. 
      // In this particular example we exclude 'GET /api/v2/Values/otherget/three' endpoint, 
      // because it was mapped to v3 with attribute: MapToApiVersion("3") 
      options.DocInclusionPredicate((version, desc) => 
      { 
       var versions = desc.ControllerAttributes() 
        .OfType<ApiVersionAttribute>() 
        .SelectMany(attr => attr.Versions); 

       var maps = desc.ActionAttributes() 
        .OfType<MapToApiVersionAttribute>() 
        .SelectMany(attr => attr.Versions) 
        .ToArray(); 

       return versions.Any(v => $"v{v.ToString()}" == version) && (maps.Length == 0 || maps.Any(v => $"v{v.ToString()}" == version)); 
      }); 

     }); 

    } 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseSwagger(); 
     app.UseSwaggerUI(c => 
     { 
      c.SwaggerEndpoint($"/swagger/v2/swagger.json", $"v2"); 
      c.SwaggerEndpoint($"/swagger/v1/swagger.json", $"v1"); 
     }); 
     app.UseMvc(); 
    } 

वहाँ दो वर्गों है कि चाल बनाने:

public class RemoveVersionFromParameter : IOperationFilter 
{ 
    public void Apply(Operation operation, OperationFilterContext context) 
    { 
     var versionParameter = operation.Parameters.Single(p => p.Name == "version"); 
     operation.Parameters.Remove(versionParameter); 
    } 
} 

public class ReplaceVersionWithExactValueInPath : IDocumentFilter 
{ 
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) 
    { 
     swaggerDoc.Paths = swaggerDoc.Paths 
      .ToDictionary(
       path => path.Key.Replace("v{version}", swaggerDoc.Info.Version), 
       path => path.Value 
      ); 
    } 
} 

RemoveVersionFromParameter इस टेक्स्टबॉक्स में swagger UI से हटा देता है:

enter image description here

ReplaceVersionWithExactValueInPath परिवर्तन इस:

enter image description here

इस के लिए

:

enter image description here

नियंत्रक वर्ग अब इस प्रकार दिखता है:

[Route("api/v{version:apiVersion}/[controller]")] 
[ApiVersion("1")] 
[ApiVersion("2")] 
public class ValuesController : Controller 
{ 
    // GET api/values 
    [HttpGet] 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // GET api/values/5 
    [HttpGet("{id}")] 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    // POST api/values 
    [HttpPost] 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/values/5 
    [HttpPut("{id}")] 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/values/5 
    [HttpDelete("{id}")] 
    public void Delete(int id) 
    { 
    } 


    [HttpGet("otherget/one")] 
    [MapToApiVersion("2")] 
    public IEnumerable<string> Get2() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    /// <summary> 
    /// THIS ONE WILL BE EXCLUDED FROM SWAGGER Ui, BECAUSE v3 IS NOT SPECIFIED. 'DocInclusionPredicate' MAKES THE 
    /// TRICK 
    /// </summary> 
    /// <returns></returns> 
    [HttpGet("otherget/three")] 
    [MapToApiVersion("3")] 
    public IEnumerable<string> Get3() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

कोड: https://gist.github.com/Alezis/bab8b559d0d8800c994d065db03ab53e

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