मेरे पास एक क्षेत्र में होस्ट किया गया एक एपीआई नियंत्रक है। हालांकि, रूटिंग काम नहीं कर रही है क्योंकि नियंत्रक क्रियाओं को हिट करने का प्रयास करते समय मेरे AJAX कॉल 404 लौटते रहते हैं। कंट्रोलर कंस्ट्रक्टर में ब्रेकप्वाइंट कभी हिट नहीं होते हैं।

[Area("WorldBuilder")]
[Route("api/[controller]")]
[ApiController]
public class WorldApiController : ControllerBase
{
    IWorldService _worldService;
    IUserRepository _userRepository;

    public WorldApiController(IWorldService worldService, IUserRepository userRepository)
    {
        _worldService = worldService;
        _userRepository = userRepository;
    }

    [HttpGet]
    public ActionResult<WorldIndexViewModel> RegionSetSearch()
    {
        string searchTerm = null;
        var userId = User.GetUserId();
        WorldIndexViewModel model = new WorldIndexViewModel();
        IEnumerable<UserModel> users = _userRepository.GetUsers();
        UserModel defaultUser = new UserModel(new Microsoft.AspNetCore.Identity.IdentityUser("UNKNOWN"), new List<Claim>());
        model.OwnedRegionSets = _worldService.GetOwnedRegionSets(userId, searchTerm);
        var editableRegionSets = _worldService.GetEditableRegionSets(userId, searchTerm);
        if (editableRegionSets != null)
        {
            model.EditableRegionSets = editableRegionSets.GroupBy(rs =>
                (users.FirstOrDefault(u => u.IdentityUser.Id == rs.OwnerId) ?? defaultUser)
                    .IdentityUser.UserName)
            .Select(g => new RegionSetCollectionModel(g)).ToList();
        }
        var viewableRegionSets = _worldService.GetViewableRegionSets(userId, searchTerm);
        if (viewableRegionSets != null)
        {
            model.ViewableRegionSets = viewableRegionSets.Where(vrs => vrs.OwnerId != userId).GroupBy(rs =>
                    (users.FirstOrDefault(u => u.IdentityUser.Id == rs.OwnerId) ?? defaultUser)
                        .IdentityUser.UserName)
                .Select(g => new RegionSetCollectionModel(g)).ToList();
        }
        return model;
    }
}

और मेरी स्टार्टअप.सीएस फ़ाइल:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {


        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {

            routes.MapRoute(name: "areaRoute",
              template: "{area}/{controller=Home}/{action=Index}/{id?}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
    }
}

मैं निम्नलिखित अजाक्स पतों की कोशिश की है:

   localhost:44344/api/WorldApi/RegionSetSearch
   localhost:44344/WorldBuilder/api/WorldApi/RegionSetSearch
   localhost:44344/api/WorldBuilder/WorldApi/RegionSetSearch
   localhost:44344/WorldBuilder/WorldApi/RegionSetSerarch

आखिरी पते के लिए मैंने कोशिश की, मैंने नियंत्रक पर रूट डेटा एनोटेशन से "एपीआई /" हटा दिया।

मुझे यकीन नहीं है कि मैं यहाँ क्या गलत कर रहा हूँ। मैं उन सभी उदाहरणों का अनुसरण कर रहा हूं जो मुझे ऑनलाइन मिले हैं।

1
charles082986 28 फरवरी 2019, 22:14

1 उत्तर

सबसे बढ़िया उत्तर

एमवीसी में दो रूटिंग प्रकार हैं, conventions routing जो एमवीसी के लिए है और route attribute routing जो वेब एपीआई के लिए है।

एमवीसी के लिए conventions routings में कॉन्फ़िगर किए गए क्षेत्र के लिए मार्ग विशेषता के साथ संयोजन नहीं किया जाना चाहिए। रूट विशेषता डिफ़ॉल्ट कन्वेंशन रूटिंग को ओवरराइड कर देगी।

यदि आप attribute routing पसंद करते हैं, तो आप कर सकते हैं

[Route("WorldBuilder/api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet("RegionSetSearch")]
    public ActionResult<IEnumerable<string>> RegionSetSearch()
    {
        return new string[] { "value1", "value2" };
    }        
}

[HttpGet("RegionSetSearch")] पर ध्यान दें जो RegionSetSearch के लिए क्रिया को परिभाषित करता है और url में एक प्लेसहोल्डर संलग्न करता है।

रेउक्स्ट https://localhost:44389/worldbuilder/api/values/RegionSetSearch है

यदि आप conventions routing पसंद करते हैं, तो आप Route और ApiController को हटा सकते हैं

[Area("WorldBuilder")]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> RegionSetSearch()
    {
        return new string[] { "value1", "value2" };
    }        
}

इस तरह, आपको UseMvc जैसे . को बदलना होगा

app.UseMvc(routes => {
    routes.MapRoute("areaRoute", "{area:exists}/api/{controller}/{action}/{id?}");
});

और अनुरोध https://localhost:44389/worldbuilder/api/values/RegionSetSearch है

9
Beengie 13 जून 2020, 19:54