c# - Swashbuckle 5 मेरे ApiControllers नहीं मिल सकता है




iis asp.net-web-api (5)

मैं एक बिंदु पर हूं जहां मुझे अपने WebAPI 2 प्रोजेक्ट के लिए वास्तव में एपीआई दस्तावेज़ीकरण की ज़रूरत है, और मैंने स्वाशबकल 5 न्यूगेट पैकेज का इस्तेमाल किया है। बॉक्स में से, मैं {myrooturl} / swagger को हिट कर सकता हूं और एक यूआई पॉप अप हो जाता है, लेकिन इसमें कोई नियंत्रक, विधियां या कुछ भी नहीं है। बस मेरा शीर्षक: [आधार url: /EM.Services, api संस्करण: v1]

मैंने स्वाशबकल डॉक्स पर एक नज़र डाला, और जब से मैं आईआईएस द्वारा होस्ट किया गया ओ ओ वाईिन का उपयोग कर रहा हूं, तब मैंने स्वगजर कॉन्फ़िफ़ को इन्हें संशोधित किया:

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));

इस डॉक्टर के अनुसार: https://github.com/domaindrivendev/Swashbuckle/blob/1326e753ce9b3a823b3c156b0b601134692ffc58/README.md#transitioning-to-swashbuckle-50

मैं एक्सएमएल डॉक्स बनाने के लिए परियोजना का निर्माण भी सेटअप करता हूं और इसके साथ मेरा स्वगगर कॉन्फ़िफ़ को इंगित करता हूं:

    private static string GetXmlCommentsPath()
    {
        // tried with an without the \bin
        return String.Format(@"{0}\bin\EM.Services.XML", AppDomain.CurrentDomain.BaseDirectory);
    }

मुझे यकीन नहीं है कि अगर एक्सएमएल डॉक्स काम कर रहा है / नहीं-काम करने के लिए इसके साथ कुछ भी है, हालांकि, जैसा कि मुझे सफ़ी-यू पेज पर बिल्कुल कोई नियंत्रक नहीं मिलता है

इसके लिए क्या है, मेरे सभी नियंत्रक एक बेसकंट्रोलर से निकलते हैं, जो बदले में अपीकंट्रोलर से प्राप्त होता है।

क्या मेरे WebApiConfig के साथ कुछ गड़बड़ है?

    public static void Register(HttpConfiguration config)
    {

        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.Filters.Add(new ValidateModelAttribute());

        config.Filters.Add(new BaseAuthenticationAttribute());

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

मेरे कंक्रीट नियंत्रक सभी इस तरह दिखते हैं (मैंने अपिंट्रोलर के लिए बेसकंट्रोलर को बंद करने की कोशिश की है और कोई बदलाव नहीं है):

[RoutePrefix("api/whatever")]
public class FooController : BaseController

और मेरे बेस नियंत्रक बहुत कुछ नहीं करते (अभी तक), बस एक विशेषता है:

[BuildClaims]
public abstract class BaseController : ApiController

IIS एक्सप्रेस या पूर्ण उड़ा IIS का उपयोग कर खाली पृष्ठ जारी रह गया है।

अद्यतन: एक अनुरूपित नियंत्रक का उदाहरण मैंने बनाया जो वास्तव में मूल है। यह भी दिखाई नहीं देता है, क्योंकि मेरे पास अभी भी बॉयलर प्लेट की तलवार नहीं है, जिसमें कुछ भी नहीं है

/// <summary>
/// I am a test
/// </summary>
[RoutePrefix("api/dummy")]
public class DummyController : ApiController
{
    [HttpGet]
    [Route("foo")]
    public int Foo()
    {
        return 42;
    }
}

Swashbuckle WebApi के मेटाडाटा परत ApiExplorer के शीर्ष पर बैठता है यह एपीआईएक्सप्लोरर से ऑपरेशन विवरण लेता है और फिर उन्हें स्वगर विवरणों के लिए मैप करता है।

चूंकि आपका नियंत्रक BASECONTROLLER से प्राप्त होता है और एपीआईसीओ नहीं करता है, यह काम नहीं करेगा

प्रति JimWolleys टिप्पणी

 private IEnumerable<ApiDescription> GetApiDescriptionsFor(string apiVersion)
    {
        return (_options.VersionSupportResolver == null)
            ? _apiExplorer.ApiDescriptions
            : _apiExplorer.ApiDescriptions.Where(apiDesc => _options.VersionSupportResolver(apiDesc, apiVersion));
    }

यह विधि है कि शक्तियों Swashbuckle सभी एपीआई कॉल पाने के लिए। यह एक आईएपीआई एक्सप्लोरर लेता है I जो कुछ अलग करने के लिए इसे संशोधित नहीं किया गया था, इसे डिफ़ॉल्ट एपीएक्सप्लोरर प्रदान किया जाता है। जो केवल उन चीजों के बारे में जानकारी है जो एपीआईकंट्रोलर से प्राप्त होते हैं

स्वशबकल जीआईटी रेपो बस GetApiDescriptions के लिए खोज करें और यह आपको सीधे विधि पर ले जाएगा


मुझे समस्या मिली रिक्त परीक्षण प्रोजेक्ट बनाने के बाद, मैंने देखा कि WebApiConfiguration global.asax ऐप प्रारंभ से शुरू किया गया था, लेकिन ओविन स्टार्टअप क्लास नहीं (जैसे मैंने किया था)।

चूंकि स्वगर / स्वाशबकल वैश्विक विन्यास में जुड़ा हुआ है और ओउइन स्टार्टअप और ग्लोबल.एक्सएक्स को अलग-अलग संदर्भों (मुझे लगता है) में रहते हैं, यह तय है कि आपकी वेबएपीआई सामग्री को ग्लोबल.एएसएसीएस से रजिस्टर करने और ओविन के ऐप ऑब्जेक्ट का इस्तेमाल वेबएपीआई।

संबंधित बिट्स:

   // global asax
    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
       // ... more stuff
    }

   //startup.cs
   public void Configuration(IAppBuilder app)
    {
        // This must happen FIRST otherwise CORS will not work.
        app.UseCors(CorsOptions.AllowAll);

        HttpConfiguration config = new HttpConfiguration();

        ConfigureAuth(app);

        // webapi is registered in the global.asax
        app.UseWebApi(config);

    }

ऊपर के रूप में rewiring के बाद, अब मैं swagger UI में नियंत्रकों और कार्यों को देख सकता हूँ।



मैंने पाया कि मेरे पास एक ही मुद्दा था। मैंने मदद के लिए एक एक्सटेंशन विधि बनाया है

using Swashbuckle.Application;
using System.Web.Http;

public static class SwaggerExtensions
{
    public static HttpConfiguration EnableSwagger(this HttpConfiguration httpConfiguration)
    {
        httpConfiguration
            .EnableSwagger(c => c.SingleApiVersion("v1", "A title for your API"))
            .EnableSwaggerUi();
        return httpConfiguration;
    }
}

फिर मेरे स्टार्टअप.cs में

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        HttpConfiguration httpConfiguration = new HttpConfiguration();

        httpConfiguration
            .EnableSwagger()    // <==== EXTENSION METHOD <==== //
            .MapHttpAttributeRoutes();

        httpConfiguration.Routes.MapHttpRoute(
            "DefaultApi",
            "api/{controller}/{id}",
            new {id = RouteParameter.Optional});

        appBuilder
            .UseWebApi(httpConfiguration);
    }
}

मेरे पास एक ही मुद्दा था और इनमें से कोई भी मेरी मदद नहीं करता था

कुछ गड़बड़ करने के बाद मुझे पता चला कि जिन मार्गों को मैंने लेबल किया था [System.Web.Mvc.Route("visit")] को स्वगजर द्वारा खोज नहीं किया गया था।

    [HttpGet]
    // ROUTE ATTRIBUTE NOT FOUND BY SWAGGER
    [System.Web.Mvc.Route("visit")]
    public string Visit()
    {

लेकिन [System.Web.Http.Route("visit")] है

    [HttpGet]
    // ROUTE ATTRIBUTE *IS* FOUND BY SWAGGER
    [System.Web.Http.Route("visit")]
    public string Visit()
    {

मैं 100% निश्चित नहीं हूँ, लेकिन अगर यह मायने रखता है, तो मैंने भी स्विच किया था

 public class MyAPIController : Controller

सेवा मेरे:

 public class MyAPIController : System.Web.Http.ApiController

अधिक सटीक रूप से मैं System.Web.Mvc के लिए "प्रयोग" कथन को निकाल दिया, लेकिन कोड को स्पष्ट उद्देश्यों के लिए सूचीबद्ध किया गया है।

उम्मीद है कि भविष्य में किसी और की मदद करेगी :) शुभकामनाएँ!