6

मैं एपीआई सहायता पृष्ठ को अपने सभी एपीआई एंडपॉइंट्स दिखाने के लिए संघर्ष कर रहा हूं, और उन्हें अपनी शैली में दिखाने के लिए संघर्ष कर रहा हूं।नेट वेब एपीआई रूटिंग और सहायता पृष्ठ

config.Routes.MapHttpRoute("Orgs", "v1/Orgs/{orgId}", 
new { controller = "Orgs", orgId = RouteParameter.Optional }); 

config.Routes.MapHttpRoute("OrgDescendants", "v1/Orgs/{orgId}/Descendants", 
new { controller = "Orgs", action = "OrgDescendants" }); 

यहाँ सब मेरी नियंत्रक तरीके::

यहाँ मेरी रास्ते हैं

[HttpGet] 
public IEnumerable<Org> GetAllOrgs() 

[HttpGet] 
public Org Get(string orgId) 

[HttpGet] 
[ActionName("OrgDescendants")] 
public List<Org> Descendants(string orgId) 

[HttpPost] 
public HttpResponseMessage Post(Org org) 

[HttpPut] 
public HttpResponseMessage Put(string orgId, Org org) 

[HttpDelete] 
public void Delete(string orgId) 

और यहाँ अंतिम बिंदु हैं कि मदद पृष्ठ प्रदर्शित करता है:

GET v1/Orgs 
POST v1/Orgs 
PUT v1/Orgs/{orgId} 
DELETE v1/Orgs/{orgId} 
GET v1/Orgs/{orgId}/Descendants 

आप के रूप में देख सकते हैं, सहायता पृष्ठ में निम्न अंतराल गुम है:

GET v1/Orgs/{orgId} 

मैंने ट्रैक खोने के कई अलग-अलग रूटिंग क्रमिक प्रयासों की कोशिश की है। जो कुछ भी मैं कोशिश करता हूं मैं हमेशा कुछ अंतराल के साथ समाप्त होता हूं या 'गलत तरीके से' स्वरूपित होता हूं।

उदाहरण के लिए, मैं के साथ अंत:

GET v1/Orgs/{orgId}/Get 

जब मैं चाहता हूँ:

GET v1/Orgs/{orgId} 

या मैं के साथ अंत:

PUT v1/Orgs?orgId={orgId} 

जब मैं चाहता हूँ:

PUT v1/Orgs/{orgId} 

इससे कोई फर्क नहीं पड़ता कि मैं किस संयोजन का प्रयास करता हूं, मैं उन्हें उन सभी तरह से प्राप्त नहीं कर सकता हूं जिन्हें मैं चाहता हूं। कोई भी सहायताकाफी प्रशंसनीय होगी!

+0

मुझे लगता है कि हेल्पपेज का अनुमान है कि 'प्राप्त करें v1/Orgs/{orgId}' मार्ग 'get (string orgId) 'और' descendants (string orgId) 'के बीच संघर्ष है। दरअसल आप शायद 'v1/Orgs/{orgId} प्राप्त करने का अनुरोध करने का प्रयास कर सकते हैं' और "एकाधिक क्रियाएं मिलीं ..." आदि जैसी कुछ त्रुटि दिखाई देनी चाहिए। –

+0

जब मैं इस तरह नेस्टेड मार्गों को परिभाषित करता हूं तो मैं आमतौर पर सेट करता हूं नेस्टेड संसाधन एक अलग नियंत्रक के रूप में, यह आपके मामले में 'descendantsController' होगा। इस तरह आप descendants पर एक पूर्ण आराम एपीआई भी हो सकता है अगर जरूरत पड़ती है। हो सकता है कि यह एक कामकाज है जिसे आप एक्सप्लोर कर सकते हैं ... – Tallmaris

+0

मैं वंशजों को अपने स्वयं के नियंत्रक के पास ले जाने के बारे में सोच रहा था, लेकिन चूंकि वे ऑर्ग भी हैं क्योंकि मैं उन्हें डुप्लीकेट कोड पर सहेजने के लिए एक ही नियंत्रक में रखना चाहता था। ऐसा लगता है कि उस समय के लिए सबसे अच्छा कामकाज हो सकता है। मैं इसे आज़मा दूंगा और देख सकता हूं कि यह काम करता है या नहीं। –

उत्तर

0

सामान्य रूप से, इस तरह की समस्या पूरी होती है, जब परियोजना वास्तुकला (पदानुक्रम) में समस्याएं होती हैं।

इसके अलावा, आप राउटर को एक अलग तरीके से जोड़ने का प्रयास कर सकते हैं। उदाहरण के लिए:

public class ProfileRouterHandler: IRouteHandler 
{ 
    private string VirtualPath { get; set; } 
    public ProfileRouterHandler() 
    { 

    } 

    public ProfileRouterHandler(string virtualPath) 
    { 
     VirtualPath = virtualPath; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string param = requestContext.RouteData.Values["uid"] as string; 
     string mode = requestContext.RouteData.Values["mode"] as string; 
     long id; 
     long.TryParse(param, out id); 
     if (id > 0) 
     { 
      string filePath = "~/Profile/Default.aspx?uid=" + param + (!string.IsNullOrEmpty(mode) ? "&mode=" + mode : ""); 
      VirtualPath = "~/Profile/Default.aspx"; 
      HttpContext.Current.RewritePath(filePath); 
     } 
     else 
     { 
      string filePath = "~/Profile/" + param + ".aspx"; 
      VirtualPath = filePath; 
      HttpContext.Current.RewritePath(filePath); 
     } 

     return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as Page; 
    } 
} 

आशा इस में मदद मिलेगी:

RouteTable.Routes.Add(
      "UserProfiles", 
      new Route("Profile/{uid}/{mode}", new ProfileRouterHandler("~/Profile/Default.aspx"))); 

रूटर हैंडलर कुछ ऐसा दिखाई देगा।

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