7

मैंने वेब एपीआई सहायता पृष्ठ दस्तावेज कॉन्फ़िगर किया है।केवल प्रतिक्रिया के लिए वेब एपीआई सहायता पृष्ठ दस्तावेज़ में पैरामीटर प्रदर्शित करने के लिए कैसे?

मैं कक्षा से नीचे हूं जो अन्य मॉडल वर्गों में विरासत में मिलेगा।

public class ResponseBase 
{ 
    public string ErrorReason { get; set; } 
    [IgnoreDataMember] 
    public bool IsRejected { get; set; } 
} 

मैं तो मैं IgnoreDataMember विशेषता के साथ सजाया धारावाहिक और जवाब में उपलब्ध होने की IsRejected नहीं चाहते।

मॉडल क्लास का उदाहरण जो ResponseBase को प्राप्त करता है।

public class Reading : ResponseBase 
{ 
    //Other properties 
} 

मैं अपने वेब एपीआई नियंत्रक में विधि नीचे है:

[HttpPost] 
[ValidationResponseFilter] 
[Route("")] 
[ResponseType(typeof(Reading))] 
public IHttpActionResult Add(List<Reading> readingList) 
{ 
    //Logic here 
} 
अब अनुरोध पैरामीटर के प्रलेखन जो वस्तुओं पढ़ना की सूची है के लिए

, उसके साथ पढ़ने के सभी गुण नीचे सूची जाएगा प्रतिक्रियाबेस वर्ग (विरासत)। मैं सहायता पृष्ठ दस्तावेज़ीकरण को केवल प्रतिक्रिया में पैरामीटर में से एक के रूप में ErrorReason को सूचीबद्ध करने के लिए चाहता हूं।

क्या कोई कॉन्फ़िगरेशन है जो मैं त्रुटि [ApiExplorerSettings(IgnoreApi = true)] त्रुटिReason पर सेट करने के अलावा कर सकता हूं? यदि मैं ऐसा करता हूं, तो त्रुटि पुनरीक्षण अनुरोध और प्रतिक्रिया पैरामीटर दोनों में उपलब्ध नहीं होगा। मैं इसे केवल प्रतिक्रिया पैरामीटर सूची में प्रदर्शित करना चाहता हूं।

+2

एक सलाह मॉडल की एक प्रतिनिधित्व कोड करने के लिए है IsRejected संपत्ति के बिना। आप automapper के साथ थकाऊ संपत्ति मैपिंग से बच सकते हैं। एक अच्छी डिजाइन पसंद है जो डोमेन मॉडल को वापस या प्राप्त नहीं करती है। इसके बजाय, वापसी और प्रतिनिधित्व प्राप्त करें। 'सूची <पढ़ना प्रस्तुतिकरण> पढ़नासूची' –

+0

मैं गुणों को मैप करने के लिए ऑटोमैपर का उपयोग कर रहा हूं और IsRejected संपत्ति IgnoreDataMember के साथ सजाया गया है, इसलिए इसे क्रमबद्ध नहीं किया जाएगा। यह वर्ग केवल डीटीओ वर्ग है और व्यवसाय वस्तु नहीं है। क्या इस का कोई मतलब निकलता है? –

+1

आपको एक विशिष्ट प्रतिनिधित्व कोड करने की आवश्यकता है। आपके पास एक आवश्यकता है जिसे IsRejected को उपयोगकर्ता इंटरफ़ेस से नहीं भेजा जाना चाहिए। यही है, उपयोगकर्ता इस संपत्ति को नहीं बदल सकता है। इसका एकमात्र तरीका, और इसके लिए अधिक सुरक्षित तरीका एक पठनवाइट प्रस्तुतिकरण है जिसमें यह संपत्ति नहीं है। यदि यह आपके कोड को सुसंगत बनाता है तो अधिक फ़ाइलों को बनाने के बारे में चिंतित न हों। –

उत्तर

0

आम तौर पर, सबसे अच्छा अभ्यास एक कस्टम ऑब्जेक्ट बनाना है जो ठीक से मेल खाता है जिसे आप स्वीकार करना चाहते हैं। इसके कारणों में से एक सुरक्षा है। 'ओवर-पोस्टिंग' और 'अंडर-पोस्टिंग' देखें: http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api ऐसा करने के लिए आप केवल उन्हीं गुणों के साथ एक नई वस्तु बनायेंगे जो आपको चाहिए।

public class ResponseBaseVM 
    { 
     public string ErrorReason { get; set; } 
     /*public bool IsRejected { get; set; }*/ 
    } 
public class ReadingVM : ResponseBaseVM 
    { 
     //Other properties that you only want available to user 
    } 

तो फिर तुम ReadingVM की सूची में

फिर ले जाएगा लेकिन प्रतिक्रिया प्रकार अभी भी typeof किया जाएगा (पढ़ने)

[HttpPost] 
[ValidationResponseFilter] 
[Route("")] 
[ResponseType(typeof(List<Reading>))] //will still display response with IsRejected 
public IHttpActionResult Add(List<ReadingVM> readingListVM) 
{ 
    //Logic here 
} 

--- हल करने के ---, मैं लगता है कि आपको उपर्युक्त विधि का पालन करना चाहिए। आपने एक काम के लिए कहा और यहां यह है। अब

private static HelpPageApiModel GenerateApiModel(ApiDescription apiDescription, HttpConfiguration config) 
{ 
    HelpPageApiModel apiModel = new HelpPageApiModel() 
    { 
     ApiDescription = apiDescription, 
    }; 

    ModelDescriptionGenerator modelGenerator = config.GetModelDescriptionGenerator(); 
    HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); 
    GenerateUriParameters(apiModel, modelGenerator); 
    GenerateRequestModelDescription(apiModel, modelGenerator, sampleGenerator); 
    GenerateResourceDescription(apiModel, modelGenerator); 
    GenerateSamples(apiModel, sampleGenerator); 

    //This will remove request body parameters from your Api Help Page matching 'IsRejected' 
    var isRejectedParameter = apiModel.RequestBodyParameters.SingleOrDefault(x => x.Name == "IsRejected"); 
    if (isRejectedParameter != null) 
     apiModel.RequestBodyParameters.Remove(isRejectedParameter); 

    //This will remove elements with 'IsRejected' for the Help Page sample requests 
    var sampleRequests = new Dictionary<MediaTypeHeaderValue, object>(); 
    foreach (var kvp in apiModel.SampleRequests) 
    { 
     //1.) iterate through each object in SampleRequests dictionary. 
     //2.) modify the json or xml to remove the "IsRejected" elements 
     //3.) assign modified results to a new dictionary 
     //4.) change the HelpPageApiModel. SampleRequests setter to be not private 
     //5.) assign new dictionary to HelpPageApiModel.SampleRequests 
     if (Equals(kvp.Key, new MediaTypeHeaderValue("application/json"))) 
     { 
      var jObject = JObject.Parse(kvp.Value.ToString()); 
      jObject.Remove("IsRejected"); 
      sampleRequests.Add(new MediaTypeHeaderValue("application/Json"), jObject.ToString()); 
     } 
     else if(Equals(kvp.Key, new MediaTypeHeaderValue("text/json"))) 
     { 
      //do stuff 
     } 
     else if (Equals(kvp.Key, new MediaTypeHeaderValue("application/xml"))) 
     { 
      //do stuff 
     } 
     else if (Equals(kvp.Key, new MediaTypeHeaderValue("text/xml"))) 
     { 
      //do stuff 
     } 
     else 
     { 
      //form urlencoded or others 
      sampleRequests.Add(kvp.Key,kvp.Value); 
     } 
    } 
    apiModel.SampleRequests = sampleRequests; 

    return apiModel; 
} 

आप देख सकते हैं 'IsRejected' के रूप में प्रतिक्रिया में मौजूद है, लेकिन नहीं reqest: HelpPageConfigurationExtensions.cs कक्षा में अपने 'GenerateApiModel' विधि का पता लगाएं और इस के साथ यह repalce। Request Help Page override

+0

मैं किसी भी छोड़ गर्म पता संपत्ति प्रतिक्रिया में लौटने से। यही कारण है कि मैंने इग्नोरडाटा मेम्बर का इस्तेमाल इज़रेजेड के लिए किया था। यह एक्सएमएल और जेसन दोनों के लिए काम करता है। डब्ल्यू टोपी मैं चाहता हूं कि यदि मैं जिस दृष्टिकोण का उल्लेख करता हूं, उसके साथ जा रहा हूं, तो मैं नहीं चाहता हूं कि वेब एपीआई सहायता पृष्ठ दस्तावेज़ीकरण में अनुरोध में ErrorReason प्रदर्शित किया जाए। मुझे उम्मीद है कि यह समझ में आता है। –

+0

@NileshThakkar मैंने आपकी स्थिति के लिए एक विशिष्ट कार्यवाही शामिल करने के लिए अपना उत्तर अपडेट किया। –

0

मैं तुम्हें संदेश सफलता या विफलता, इस तरह के रूप में वे, के लिए होती हैं जब तक कि वहाँ एक विशेष कारण आप एक HTTP स्थिति कोड 200 (ठीक) के रूप में त्रुटियों लौटना चाहते है का एक तरीका के रूप में HTTP स्थिति कोड का उपयोग करने का सुझाव बजाय ।

इस तरह के परिदृश्य से निपटने का सामान्य तरीका है जब सब ठीक है, और 4xx या 5xx स्टेटस कोड त्रुटि होने पर 2xx-स्टेटस कोड वापस करना है। इस तरह से ग्राहक सफल परिचालनों से त्रुटि परिस्थितियों को स्पष्ट रूप से अलग कर सकता है।

त्रुटि हैंडलिंग पर इस विषय पर एक अच्छा ब्लॉग पोस्ट Exception Not Found -Blog पर पाया जा सकता है, जहां एक नियंत्रक कार्रवाई के इस अच्छा उदाहरण लिया जाता है से:

[Route("CheckId/{id}")] 
[HttpGet] 
public IHttpActionResult CheckId(int id) 
{ 
    if (id > 100) 
    { 
     var message = new HttpResponseMessage(HttpStatusCode.BadRequest) 
     { 
      Content = new StringContent("We cannot use IDs greater than 100.") 
     }; 
     throw new HttpResponseException(message); 
    } 
    return Ok(id); 
} 
संबंधित मुद्दे