MVC Controller не может найти Api Controller (тот же проект) - PullRequest
0 голосов
/ 20 марта 2019

(Извините, если мой английский немного отстой)

Я пытаюсь вызвать метод api из контроллера mvc, но mvc, похоже, не может найти метод. Я установил маршрут в контроллере mvc как

[Route("[controller]")]

и в контроллере API как

[Route("api/[controller]")]

В файле startup.cs я добавил эту команду для включения маршрута по умолчанию

app.UseMvcWithDefaultRoute();

Код контроллера Mvc:

[HttpGet]
    public async Task<ActionResult> GetAll()
    {
        IEnumerable<Utente> utenti = null;

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:57279/");
            var Res = await client.GetAsync("api/utente/GetAll");

            if (Res.IsSuccessStatusCode)
            {
                var readTask = Res.Content.ReadAsAsync<IList<Utente>>();
                utenti = readTask.Result;
            }
            else
            {
                utenti = Enumerable.Empty<Utente>();

                ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
            }
        }
        return View(utenti);
    }

Код API:

[HttpGet]
    public IHttpActionResult GetAll()
    {
        IList<Utente> utenti = null;

        using (_utenteContext)
        {
            utenti = _utenteContext.Utenti.Select(u => new Utente()
                        {
                            id = u.id,
                            user = u.user,
                            password = u.password
                        }).ToList<Utente>();
        }

        if (utenti.Count == 0)
        {
            return NotFound();
        }

        return Ok(utenti);
    }

Возможно, проблема в том, что я следую старому примеру обоих контроллеров mvc и api в одном проекте, но я бы хотел, чтобы вы, ребята, могли помочь мне с этим.

В:

var Res = await client.GetAsync("api/utente/GetAll");

Я всегда получаю {StatusCode: 404, ReasonPhrase: 'Not Found', ...} независимо от того, какие изменения я внесу в код.

EDIT:

Весь контроллер Api (я тоже пытался с помощью метода POST, но он тоже не работает)

using AdrianWebApi.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace AdrianWebApi.Controllers.api
{
[Route("api/[controller]")]
public class UtenteController : ApiController
{
    private readonly UtenteContext _utenteContext;

    public UtenteController(UtenteContext context)
    {
        _utenteContext = context;
    }

    [HttpGet]
    public IHttpActionResult GetAll()
    {
        IList<Utente> utenti = null;

        using (_utenteContext)
        {
            utenti = _utenteContext.Utenti.Select(u => new Utente()
                        {
                            id = u.id,
                            user = u.user,
                            password = u.password
                        }).ToList<Utente>();
        }

        if (utenti.Count == 0)
        {
            return NotFound();
        }

        return Ok(utenti);
    }

    [HttpPost]
    public IHttpActionResult PostNewUtente(Utente utente)
    {
        if (!ModelState.IsValid)
            return BadRequest("Not a valid model");

        using (_utenteContext)
        {
            _utenteContext.Utenti.Add(new Utente()
            {
                id = utente.id,
                user = utente.user,
                password = utente.password
            });

            _utenteContext.SaveChanges();
        }

        return Ok();
    }
}
}

РЕДАКТИРОВАТЬ 2 Класс запуска, если он полезен:

using AdrianWebApi.Models;
using AdrianWebApi.Models.DataManager;
using AdrianWebApi.Models.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace AdrianWebApi
{
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<UtenteContext>(options =>{options.UseMySQL("server=localhost;database=dbutenti;User ID=root;password=root;");});
        services.AddScoped<IDataRepository<Utente>, DataManager>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseMvcWithDefaultRoute();
    }
}
}

РЕДАКТИРОВАТЬ 3 Опубликовать метод MVC, если кому-то интересно, работает, по крайней мере для меня:

[Route("Add")]
    [System.Web.Http.HttpPost]
    public ActionResult Add([FromForm]Utente utente)
    {
        if (utente.password == null)
        {
            return View();
        }
        else
        {

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:57279/api/");

                //HTTP POST
                var postTask = client.PostAsJsonAsync<Utente>("utente", utente);
                postTask.Wait();

                var result = postTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("GetAll");
                }
            }
            ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
            return View(utente);
        }
    }

1 Ответ

0 голосов
/ 20 марта 2019

Попробуйте закомментировать ваш контроллер и заменить его следующим кодом, затем перейдите к api/utente/ и посмотрите, получите ли вы результат.Если вы это сделаете, замените то, что вам нужно, на ваш код.

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace AdrianWebApi.Controllers.api
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "Test 1", " Test 2" };
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...