ওয়েব অপির জন্য এক্সএমএল ডকুমেন্টেশন কীভাবে মূল প্রকল্পের বাইরে থাকা ডকুমেন্টেশনগুলিকে অন্তর্ভুক্ত করতে পারে?


102

ডকুমেন্টেশন আপনার ওয়েব API প্রোজেক্টের মধ্যে XmlDoc ইন্টিগ্রেশন সক্রিয় শুধু হ্যান্ডেল পরিস্থিতিতে যেখানে আপনার এপিআই ধরনের সব আপনার WebApi প্রকল্পের অংশ বলে মনে হচ্ছে। বিশেষত, এটি কীভাবে এক্সএমএল ডকুমেন্টেশনগুলিতে পুনরায় তৈরি করতে হবে App_Data/XmlDocument.xmlএবং আপনার কনফিগারেশনের একটি লাইনকে সংঘাতবদ্ধ করবে যা সেই ফাইলটি গ্রাস করবে discus এটি কেবলমাত্র একটি প্রকল্পের ডকুমেন্টেশন ফাইলের জন্য স্পষ্টভাবে মঞ্জুরি দেয়।

তবে আমার সেটআপে আমার অনুরোধ এবং প্রতিক্রিয়ার ধরণের একটি সাধারণ "মডেল" প্রকল্পে সংজ্ঞায়িত করা আছে। এর অর্থ হ'ল যদি আমার একটি শেষ পয়েন্ট থাকে যেমন:

[Route("auth/openid/login")]
public async Task<AuthenticationResponse> Login(OpenIdLoginRequest request) { ... }

OpenIdLoginRequestপৃথক সি # প্রকল্পে এর মতো যেখানে সংজ্ঞায়িত করা হয়েছে:

public class OpenIdLoginRequest
{
    /// <summary>
    /// Represents the OpenId provider that authenticated the user. (i.e. Facebook, Google, etc.)
    /// </summary>
    [Required]
    public string Provider { get; set; }

    ...
}

এক্সএমএল ডকোমমেন্টস সত্ত্বেও, requestআপনি যখন এন্ডপয়েন্ট-নির্দিষ্ট সাহায্য পৃষ্ঠা (যেমন http://localhost/Help/Api/POST-auth-openid-login) দেখেন তখন প্যারামিটারের বৈশিষ্ট্যগুলিতে কোনও ডকুমেন্টেশন থাকে না ।

এক্সএমএল ডকুমেন্টেশন সহ সাব-প্রজেক্টগুলিতে প্রকারভেদগুলি ওয়েব এপিআই এক্সএমএল ডকুমেন্টেশনে প্রকাশিত হ'ল আমি কীভাবে এটি তৈরি করতে পারি?

উত্তর:


165

এটি অর্জনের জন্য কোনও অন্তর্নির্মিত উপায় নেই। তবে এর জন্য কয়েকটি পদক্ষেপ প্রয়োজন:

  1. আপনার ওয়েব এপিআই প্রকল্পের মতো আপনার সাবপ্রজেক্টের (প্রকল্পের বৈশিষ্ট্য / বিল্ড থেকে) এক্সএমএল ডকুমেন্টেশন সক্ষম করুন। এই সময় ব্যতীত, এটিকে সরাসরি রুট করুন XmlDocument.xmlযাতে এটি আপনার প্রকল্পের মূল ফোল্ডারে উত্পন্ন হয়।

  2. আপনার App_Dataফোল্ডারে এই এক্সএমএল ফাইলটি অনুলিপি করতে আপনার ওয়েব এপিআই প্রকল্পের পোস্ট বিল্ড ইভেন্টটি সংশোধন করুন :

    copy "$(SolutionDir)SubProject\XmlDocument.xml" "$(ProjectDir)\App_Data\Subproject.xml"

    কোথায় Subproject.xmlযাই হোক না কেন আপনার প্রকল্প নামের নতুন নামকরণ করা উচিত প্লাস .xml

  3. পরবর্তীটি Areas\HelpPage\App_Start\HelpPageConfigনিম্নলিখিত লাইনটি খুলুন এবং সনাক্ত করুন:

    config.SetDocumentationProvider(new XmlDocumentationProvider(
        HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));

    XML সহায়তা ডকুমেন্টেশন প্রথম স্থানে সক্ষম করার জন্য আপনি প্রথমে নিখরচায় এই লাইন। এই লাইনটি এর সাথে প্রতিস্থাপন করুন:

    config.SetDocumentationProvider(new XmlDocumentationProvider(
        HttpContext.Current.Server.MapPath("~/App_Data")));

    এই পদক্ষেপটি নিশ্চিত করে যে XmlDocumentationProviderআপনার প্রকল্পের জন্য নির্দিষ্ট এক্সএমএল ফাইলের পরিবর্তে আপনার এক্সএমএল ফাইল রয়েছে এমন ডিরেক্টরিটি পাস করেছে।

  4. শেষ অবধি, Areas\HelpPage\XmlDocumentationProviderনিম্নলিখিত উপায়ে সংশোধন করুন :

    ক। _documentNavigatorক্ষেত্রটি এর সাথে প্রতিস্থাপন করুন :

    private List<XPathNavigator> _documentNavigators = new List<XPathNavigator>();

    খ। নির্মাণকারীর সাথে প্রতিস্থাপন করুন:

    public XmlDocumentationProvider(string appDataPath)
    {
        if (appDataPath == null)
        {
            throw new ArgumentNullException("appDataPath");
        }
    
        var files = new[] { "XmlDocument.xml", "Subproject.xml" };
        foreach (var file in files)
        {
            XPathDocument xpath = new XPathDocument(Path.Combine(appDataPath, file));
            _documentNavigators.Add(xpath.CreateNavigator());
        }
    }

    গ। নির্মাতার নীচে নিম্নলিখিত পদ্ধতি যুক্ত করুন:

    private XPathNavigator SelectSingleNode(string selectExpression)
    {
        foreach (var navigator in _documentNavigators)
        {
            var propertyNode = navigator.SelectSingleNode(selectExpression);
            if (propertyNode != null)
                return propertyNode;
        }
        return null;
    }

    ঘ। এবং সর্বশেষে, সমস্ত সংকলক ত্রুটিগুলি ঠিক করুন (সেখানে তিনটি হওয়া উচিত) যার ফলে অংশটি উল্লেখ করা যায় _documentNavigator.SelectSingleNodeএবং মুছে ফেলা হয় _documentNavigator.যাতে এটি এখন SelectSingleNodeআমাদের উপরে বর্ণিত নতুন পদ্ধতিটিকে কল করে ।

এই শেষ পদক্ষেপটি হ'ল ডকুমেন্ট সরবরাহকারীকে কেবল প্রাথমিক প্রকল্পের পরিবর্তে সহায়তার পাঠ্যের জন্য একাধিক এক্সএমএল নথিগুলির মধ্যে সন্ধানের জন্য সমর্থন করে।

এখন আপনি যখন আপনার সহায়তা ডকুমেন্টেশন পরীক্ষা করেন, এটিতে আপনার সম্পর্কিত প্রকল্পের ধরণের এক্সএমএল ডকুমেন্টেশন অন্তর্ভুক্ত থাকবে।


7
দুর্দান্ত উত্তর। আমি প্রকৃতপক্ষে মনে করি নির্মাণকারীর পক্ষে একটি স্ট্রিংয়ের অ্যারে গ্রহণ করা কিছুটা সহজ public
ক্যাপ্টেন জন

14
কল্পনাপ্রসূত, আমি যা খুঁজছিলাম ঠিক এটিই ছিল !! আপনি যদি (আমার মত) সর্বদা সেখানে থাকা xML ডকুমেন্টেশন ফাইলগুলির নাম / সংখ্যা জানেন না তবে এর var files...সাথে রেখাটি প্রতিস্থাপনের পরামর্শ দিন var files = Directory.GetFiles(documentPath, "*.xml");। প্রয়োজন অনুযায়ী আরও ফিল্টারিং করতে পারে।
sǝɯɐſ

2
@ লান্দ্রো, উত্তরটি উন্নত করার জন্য ধন্যবাদ! :) ভাল লাগছে আপনি এটি সহায়ক বলে চিহ্নিত করেছেন.
কર્ક ভোল

5
যদি আমি এই বিশদ এবং সঠিক উত্তরটির জন্য আপনাকে +10 করতে পারি
মার্ক ভ্যান স্ট্রেন

2
আমি এখানকার অন্যদের উপরে আমার পরিবর্তনগুলি যুক্ত করতে চাই। মূল প্রকল্প অ্যাপ_ডাটা \ ডকুমেন্টেশন ফোল্ডারে এক্সএমএল ফাইল তৈরি করতে আমি ... \ স্বরলিপিটি ব্যবহার করেছি। আমি তখন সেই ডিরেক্টরি থেকে সমস্ত এক্সএমএল ফাইল পল করার জন্য @ এসǝɯɐſ পদ্ধতি ব্যবহার করেছি। এটি সুন্দরভাবে কাজ করে এবং অবাক হয় যে এটি কেবল বাক্স থেকে কীভাবে কাজ করে তা নয়। অনেক ধন্যবাদ.
দারোল

32

আমি এটিতেও ছুটে এসেছি, তবে পরে সমস্যা এড়াতে আমি উত্পন্ন কোনও কোড সম্পাদনা বা সদৃশ করতে চাইনি।

অন্যান্য উত্তরের উপর ভিত্তি করে, একাধিক এক্সএমএল উত্সগুলির জন্য এখানে একটি স্ব-অন্তর্ভুক্ত ডকুমেন্টেশন প্রদানকারী। এটি কেবল আপনার প্রকল্পে ফেলে দিন:

/// <summary>A custom <see cref="IDocumentationProvider"/> that reads the API documentation from a collection of XML documentation files.</summary>
public class MultiXmlDocumentationProvider : IDocumentationProvider, IModelDocumentationProvider
{
    /*********
    ** Properties
    *********/
    /// <summary>The internal documentation providers for specific files.</summary>
    private readonly XmlDocumentationProvider[] Providers;


    /*********
    ** Public methods
    *********/
    /// <summary>Construct an instance.</summary>
    /// <param name="paths">The physical paths to the XML documents.</param>
    public MultiXmlDocumentationProvider(params string[] paths)
    {
        this.Providers = paths.Select(p => new XmlDocumentationProvider(p)).ToArray();
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetDocumentation(MemberInfo subject)
    {
        return this.GetFirstMatch(p => p.GetDocumentation(subject));
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetDocumentation(Type subject)
    {
        return this.GetFirstMatch(p => p.GetDocumentation(subject));
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetDocumentation(HttpControllerDescriptor subject)
    {
        return this.GetFirstMatch(p => p.GetDocumentation(subject));
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetDocumentation(HttpActionDescriptor subject)
    {
        return this.GetFirstMatch(p => p.GetDocumentation(subject));
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetDocumentation(HttpParameterDescriptor subject)
    {
        return this.GetFirstMatch(p => p.GetDocumentation(subject));
    }

    /// <summary>Gets the documentation for a subject.</summary>
    /// <param name="subject">The subject to document.</param>
    public string GetResponseDocumentation(HttpActionDescriptor subject)
    {
        return this.GetFirstMatch(p => p.GetResponseDocumentation(subject));
    }


    /*********
    ** Private methods
    *********/
    /// <summary>Get the first valid result from the collection of XML documentation providers.</summary>
    /// <param name="expr">The method to invoke.</param>
    private string GetFirstMatch(Func<XmlDocumentationProvider, string> expr)
    {
        return this.Providers
            .Select(expr)
            .FirstOrDefault(p => !String.IsNullOrWhiteSpace(p));
    }
}

... এবং আপনার HelpPageConfigযে এক্সএমএল ডকুমেন্টগুলি চান তার পথে এটি সক্ষম করুন :

config.SetDocumentationProvider(new MultiXmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/Api.xml"), HttpContext.Current.Server.MapPath("~/App_Data/Api.Models.xml")));

এটি একটি দুর্দান্ত সমাধান। আমি এটি সমাধানগুলিতে পছন্দ করি যেগুলির জন্য ডিফল্ট হেল্পপেজ শ্রেণিগুলির সংশোধন প্রয়োজন কারণ তারা আপডেটগুলিতে ওভাররাইট করা হবে।
অরোনভানআম্মার্স

3
এটি দুর্দান্তভাবে কাজ করে, পোস্ট করার জন্য আপনাকে ধন্যবাদ। এই অল্প সময় ব্যবহার করে যে কেউ কাউকে বাঁচাতে, আপনাকে এখনও উপরের কার্কের গৃহীত উত্তরের প্রথম দুটি পর্যায়ে করতে হবে, যেমন 1) আপনার সাবপ্রজেক্টের জন্য এক্সএমএল ডকুমেন্টেশন সক্ষম করুন এবং 2) এই এক্সএমএল ফাইলটি অনুলিপি করতে আপনার ওয়েব এপিআই প্রকল্পের পোস্ট বিল্ড ইভেন্টটি পরিবর্তন করুন আপনার App_Data ফোল্ডার।
tomRedox

1
এবং তারপরে এই লাইনটি পরিণত হয়: কনফিগারেশনসেট ডকুমেন্টেশনপ্রভাইডার (নতুন মাল্টিএক্সএমএল ডকুমেন্টেশনপ্রভাইডার (এইচটিপিসিন্টেক্সট.ক্রেনার। সার্ভার.ম্যাপপ্যাথ ("~ / অ্যাপ্লিকেশন_ডাটা / [মূল ওয়েব এপিআই প্রকল্পের এক্সএমএল ফাইলের নাম, এক্সএমএল ডকুমেন্ট।। এক্সএমএল"), এইচটিপি.কম্পার্টস.ভার্ট.সেন্টার্টস.সি। ("~ / অ্যাপ_ডাটা / [আপনি যা কিছু বলেছিলেন আপনার সাবপ্রজেক্ট এক্সএমএল ফাইলের নাম]। XML")));
tomRedox

পদক্ষেপগুলি অনুসরণ করেও কাজ করে নি :(। কোনও ত্রুটি নেই তাই ভুল হয়েছে কিনা তা নিশ্চিত নয় It এটি এখনও কেবল এপি ডকুমেন্টটি দেখায় তবে অতিরিক্ত প্রকল্প নথিটিও নয় I আমি স্বীকৃত উত্তরের পদক্ষেপগুলিও চেষ্টা করেছি এবং এটি একই জিনিস) । নির্দিষ্ট কিছু আমি চেক করা উচিত?
stt106

কোনও কারণে আমি এখনও ডিফল্ট জিইটি এপিআই / আমাকে দেখতে পাচ্ছি যা ভিএস-তে শুরু হওয়া প্রকল্পের টেম্পলেট নিয়ে আসে
জন জাবরোস্কি


0

এখানে আমি এটির সাথে একটি উত্তর লিঙ্ক সরবরাহ করি, যা আপনাকে সহায়তা করতে পারে। ডকুমেন্টেশনের জন্য আপনি একাধিক এক্সএমএল ফাইল সহজেই ব্যবহার করতে পারেন।

ওয়েব অপি সহায়তা পৃষ্ঠা এক্সএমএল 1 টিরও বেশি ফাইল থেকে মন্তব্য করেছে


0

এই সমস্যাটি সমাধানের সহজতম উপায় হ'ল আপনি মোতায়েন করা সার্ভারে App_Code ফোল্ডার তৈরি করা। তারপরে আপনার বিন ফোল্ডারে থাকা XMLDocament.xml স্থানীয়ভাবে App_Code ফোল্ডারে অনুলিপি করুন


পরামর্শের জন্য ধন্যবাদ !! এর মতো সহায়ক উত্তরের জন্য আর -1 নেই। হ্যাঁ, আপনি যদি এটি অ্যাজুরে ক্লাউড অ্যাপ্লিকেশন পরিষেবাটিতে স্থাপন করেন তবে একাধিক * .xML মোতায়েনের সাথে অনেকগুলি সমস্যা দেখা দেয়, সুতরাং এগুলি সোয়াগারের জন্য উপলব্ধ করা যায়, উদাহরণস্বরূপ, সত্যই জটিল। তবে আমি বরং আরও একটি স্ট্যান্ডার্ড এএসপি.নেট সার্ভার-সাইড ফোল্ডার বেছে নেব, যাকে অ্যাপ_গ্লোবাল রিসোর্স বলা যায়, যেহেতু xmldoc ফাইলগুলি সম্পদের সাথে বেশ মিল similar এটি বিশেষত সত্য কারণ আমার প্রকল্পে এখনও আমার কাছে অ্যাপ_কোড ফোল্ডার নেই এবং কোন স্ট্যান্ডার্ড ফোল্ডারটি তৈরি করা উচিত তা বিবেচ্য নয়।
moudrick

নিম্নলিখিত স্ট্যান্ডার্ড ফোল্ডারটি আমার জন্য কাজ করেছে: অ্যাপ্লিকেশন_কোড - ডিফল্ট সেটিংসে ক্লায়েন্টের থেকে দৃশ্যমান নয় অ্যাপ_গ্লোবাল রিসোর্স - ডিফল্ট সেটিংসে ক্লায়েন্টের থেকে দৃশ্যমান নয় অ্যাপ_লোকালআরসোসেস - ডিফল্ট সেটিংসে ক্লায়েন্ট থেকে দৃশ্যমান নয়
মউড্রিক

আমাকে প্রতিটি স্ট্যান্ডার্ড ফোল্ডারগুলির সাথেও সমস্যাগুলি তালিকাবদ্ধ করতে দাও যা আমার পক্ষে কাজ করে না। বিন - শুধুমাত্র * প্রধান সমাবেশের জন্য এক্সএক্সএমএল অ্যাপ_ডাটাতে ডিপ্লোপি করা হয় - সবচেয়ে কার্যকর সেটিংস হ'ল মেঘে মোতায়েন করার জন্য এই ফোল্ডারে থাকা সমস্ত কিছু বাদ দেওয়া
মউড্রিক

যারা এই উত্তরটি সম্পাদনা করতে আগ্রহী তারা কি সম্ভবত বর্ধিত জল্পনা নিয়ে উপরে এই সমস্ত বিবেচনাগুলি প্রতিফলিত করতে পারে?
moudrick
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.