首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET核心MVC请求返回404

ASP.NET核心MVC请求返回404
EN

Stack Overflow用户
提问于 2020-09-15 22:57:02
回答 1查看 1.7K关注 0票数 0

我创建了一个快速的项目来证明一个观点,现在我想我很糟糕。出于某种原因,我在这个非常简单的站点设置中在端点上拉404错误。我觉得我好像漏掉了一些小东西,但我似乎不能把手指放在上面。

任何帮助都是很棒的,我真的不能把我的头脑集中在如何创建路由和/或我试图使用的路由是如何无效的?

我只使用过.NET框架,而.NET核心似乎处理的事情略有不同。

最初,我刚用method=POST把它变成了一个针对asp-控制器/asp-操作的表单。然而,这是行不通的,我收到了404页。

然后我尝试使用jQuery Ajax请求,结果相同。

Startup.cs

代码语言:javascript
运行
复制
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.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");

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

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute();
        });
    }
}

家庭控制员:

代码语言:javascript
运行
复制
public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Privacy()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        var model = new ErrorViewModel {RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier};

        if (Response.StatusCode.Equals(HttpStatusCode.NotFound))
            return View("~/Views/Shared/404.cshtml", model);

        return View(model);
    }

    [HttpPost]
    public async Task<IActionResult> DownloadAsync([FromBody] DownloadModel model)
    {
        try
        {
            var youtube = new YoutubeClient();
            var manifest = await youtube.Videos.Streams.GetManifestAsync(model.VideoId);

            var info = manifest.GetMuxed().WithHighestVideoQuality();

            if (info != null)
            {
                var file = $"{model.VideoId}.{info.Container}";
                await youtube.Videos.Streams.DownloadAsync(info, file);
                var bytes = await System.IO.File.ReadAllBytesAsync(file);
                return File(bytes, "application/force-download", file);
            }
        }
        catch (Exception e)
        {
            // TODO: Document Exception
            this._logger.LogError(e, $"Download exception occurred.");
        }

        return BadRequest();
    }
}

Index.cshtml

代码语言:javascript
运行
复制
@model DownloadModel
@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Yipper (Youtube Ripper)</h1>
    <input type="text" asp-for="Url" class="url-input" id="url-textbox"/>
    <button id="url-submit-btn" class="url-btn" type="submit">RIP</button>
</div>

@section Scripts
{
    <script>
        function download(e) {
            e.preventDefault();
            const request = {
                "Url": $("#url-textbox").val() 
            }
            console.log(request);
            $.ajax('@Url.Action("DownloadAsync", "Home")',
                {
                    method: "POST",
                    data: request
                }).done(function(result) {
                    console.log(result);
                }).fail(function(error) {
                    console.log(error);
                });
        }

        $(function() {
            $("#url-submit-btn").click(download);
        });
    </script>
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-16 02:21:29

ASP.NET核心将在.Net Core3.0之后默认情况下从动作名称中修剪后缀异步,您可以引用链接.So,您可以将ajax url更改为@Url.Action("Download", "Home"),然后将对象发布为操作,因此需要删除[FromBody].Here是一个演示工作:

主计长:

代码语言:javascript
运行
复制
[HttpPost]
        public async Task<IActionResult> DownloadAsync(DownloadModel model)
        {
            return Ok();
        }

Index.cshtml:

代码语言:javascript
运行
复制
<div class="text-center">
    <h1 class="display-4">Yipper (Youtube Ripper)</h1>
    <input type="text" asp-for="Url" class="url-input" id="url-textbox" />
    <button id="url-submit-btn" class="url-btn" type="submit">RIP</button>
</div>

@section Scripts
{
    <script>
        function download(e) {
            e.preventDefault();
            const request = {
                "Url": $("#url-textbox").val()
            }
            console.log(request);
            $.ajax('@Url.Action("Download", "Home")',
                {
                    method: "POST",
                    data: request
                }).done(function(result) {
                    console.log(result);
                }).fail(function(error) {
                    console.log(error);
                });
        }

        $(function() {
            $("#url-submit-btn").click(download);
        });
    </script>
}

结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63910901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档