9

मेरे पास मेरा वेब एपीआई है और मैंने अपने दस्तावेज़ों को स्वतः उत्पन्न करने के लिए web api help pages जोड़ा। यह तरीकों जहाँ मेरे मापदंडों बाहर सूचीबद्ध हैं के लिए महान काम कर रहा है, लेकिन मैं इस तरह की एक विधि है:वेब एपीआई सहायता पृष्ठ - संपत्ति प्रलेखन को अनुकूलित करना

public SessionResult PostLogin(CreateSessionCommand request) 

और, मेरी मदद पृष्ठ पर, यह केवल गुण अनुभाग में आदेश पैरामीटर लिस्टिंग है। हालांकि, नमूना अनुरोध खंड में, यह मेरे CreateSessionCommand वर्ग के सभी गुणों को सूचीबद्ध करता है।

पैरामीटर

नाम | विवरण | अतिरिक्त जानकारी

अनुरोध | कोई दस्तावेज उपलब्ध नहीं है। | अनुरोध निकाय में इस पैरामीटर को परिभाषित करें।

मैं इसे अपने CreateSessionCommand कक्षा में सभी गुणों को सूचीबद्ध करने के बजाय इसे पसंद करूंगा। क्या इसे करने का कोई आसान तरीका है?

उत्तर

6

यह @Josh उत्तर के अतिरिक्त के रूप में जाना चाहिए। यदि आप न केवल मॉडल वर्ग से गुण सूचीबद्ध करना चाहते हैं, लेकिन यह भी प्रत्येक प्रॉपर्टी के लिए दस्तावेज शामिल, क्षेत्रों/HelpPage/XmlDocumentationProvider.cs फ़ाइल के रूप में निम्नानुसार संशोधित किया जाना चाहिए:

public virtual string GetDocumentation(HttpParameterDescriptor parameterDescriptor) 
{ 
    ReflectedHttpParameterDescriptor reflectedParameterDescriptor = parameterDescriptor as ReflectedHttpParameterDescriptor; 
    if (reflectedParameterDescriptor != null) 
    { 
     if (reflectedParameterDescriptor.ParameterInfo is CustomParameterInfo) 
     { 
      const string PropertyExpression = "/doc/members/member[@name='P:{0}']"; 
      var pi = (CustomParameterInfo) reflectedParameterDescriptor.ParameterInfo; 

      string selectExpression = String.Format(CultureInfo.InvariantCulture, PropertyExpression, pi.Prop.DeclaringType.FullName + "." + pi.Prop.Name); 
      XPathNavigator methodNode = _documentNavigator.SelectSingleNode(selectExpression); 
      if (methodNode != null) 
      { 
       return methodNode.Value.Trim(); 
      } 
     } 
     else 
     { 
      XPathNavigator methodNode = GetMethodNode(reflectedParameterDescriptor.ActionDescriptor); 
      if (methodNode != null) 
      { 
       string parameterName = reflectedParameterDescriptor.ParameterInfo.Name; 
       XPathNavigator parameterNode = methodNode.SelectSingleNode(String.Format(CultureInfo.InvariantCulture, ParameterExpression, parameterName)); 
       if (parameterNode != null) 
       { 
        return parameterNode.Value.Trim(); 
       } 
      }      
     } 
    } 

    return null; 
} 

और CustomParameterInfo वर्ग चाहिए संपत्ति की जानकारी भी रखें:

internal class CustomParameterInfo : ParameterInfo 
{ 
    public PropertyInfo Prop { get; private set; } 

    public CustomParameterInfo(PropertyInfo prop) 
    { 
     Prop = prop; 
     base.NameImpl = prop.Name; 
    } 
} 
+1

मैं आपको धन्यवाद नहीं दे सकता, यह वास्तव में मेरे लिए सहायक था! – Haney

3

यह वर्तमान में बॉक्स से बाहर समर्थित नहीं है। निम्नलिखित बग उस प्रकार से संबंधित है: http://aspnetwebstack.codeplex.com/workitem/877

+2

बमर। मैं एक कामकाज खोजना चाहता हूँ। – Josh

7

तो, अगर कोई दिलचस्पी लेता है, तो मैं इस समस्या के लिए एक समाधान तैयार करने में कामयाब रहा।

public static void AlterApiDescription(this ApiDescription apiDescription, HttpConfiguration config) 
{ 
    var docProvider = config.Services.GetDocumentationProvider(); 
    var addParams = new List<ApiParameterDescription>(); 
    var removeParams = new List<ApiParameterDescription>(); 

    foreach (var param in apiDescription.ParameterDescriptions) 
    { 
     var type = param.ParameterDescriptor.ParameterType; 

     //string is some special case that is not a primitive type 
     //also, compare by full name because the type returned does not seem to match the types generated by typeof 
     bool isPrimitive = type.IsPrimitive || String.Compare(type.FullName, typeof(string).FullName) == 0; 

     if (!isPrimitive) 
     { 
      var properties = from p in param.ParameterDescriptor.ParameterType.GetProperties() 
           let s = p.SetMethod 
           where s.IsPublic 
           select p; 

      foreach (var property in properties) 
      { 
       var documentation = docProvider.GetDocumentation(new System.Web.Http.Controllers.ReflectedHttpParameterDescriptor() 
       { 
        ActionDescriptor = param.ParameterDescriptor.ActionDescriptor, 
        ParameterInfo = new CustomParameterInfo(property) 
       }); 

       addParams.Add(new ApiParameterDescription() 
       { 
        Documentation = documentation, 
        Name = property.Name, 
        Source = ApiParameterSource.FromBody, 
        ParameterDescriptor = param.ParameterDescriptor 
       }); 
      } 

      //since this is a complex type, select it to be removed from the api description 
      removeParams.Add(param); 
     } 
    } 

    //add in our new items 
    foreach (var item in addParams) 
    { 
     apiDescription.ParameterDescriptions.Add(item); 
    } 

    //remove the complex types 
    foreach (var item in removeParams) 
    { 
     apiDescription.ParameterDescriptions.Remove(item); 
    } 
} 

और यहाँ पैरामीटर जानकारी instanced वर्ग मैं

internal class CustomParameterInfo : ParameterInfo 
{ 
    public CustomParameterInfo(PropertyInfo prop) 
    { 
     base.NameImpl = prop.Name; 
    } 
} 

का उपयोग फिर, हम अंदर एक और तरीका में विस्तार कहते हैं:

HelpPageConfigurationExtensions.cs में मैं निम्न एक्सटेंशन विधि जोड़ा एक्सटेंशन वर्ग

public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId) 
{ 
    object model; 
    string modelId = ApiModelPrefix + apiDescriptionId; 
    if (!config.Properties.TryGetValue(modelId, out model)) 
    { 
     Collection<ApiDescription> apiDescriptions = config.Services.GetApiExplorer().ApiDescriptions; 
     ApiDescription apiDescription = apiDescriptions.FirstOrDefault(api => String.Equals(api.GetFriendlyId(), apiDescriptionId, StringComparison.OrdinalIgnoreCase)); 
     if (apiDescription != null) 
     { 
      apiDescription.AlterApiDescription(config); 

      HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); 
      model = GenerateApiModel(apiDescription, sampleGenerator); 
      config.Properties.TryAdd(modelId, model); 
     } 
    } 

    return (HelpPageApiModel)model; 
} 

टिप्पणियां जिनका उपयोग किया जाता है यह नियंत्रक विधि में जोड़ा जाना चाहिए और वर्ग वस्तु के गुण नहीं। ऐसा इसलिए हो सकता है क्योंकि मेरी वस्तु बाहरी पुस्तकालय का हिस्सा है

+0

मैं आपको धन्यवाद नहीं दे सकता, यह वास्तव में मेरे लिए सहायक था! – Haney

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