首页 > 解决方案 > 路径 /api/* 的控制器未找到或未实现 IController

问题描述

我目前正在学习 ASP.NET MVC,我的任务是创建一个用户可以上传文件的网站。

我已将以下 FileUploadingController 编写为 API,当我尝试通过我的网站视图中的表单调用时,我收到以下错误:'找不到或未实现路径的控制器'/api/FileUploading/UploadFile'控制器。

这是我上传用户文件的 API。

public class FileUploadingController : ApiController
{
    [HttpPost]
    [Route("api/FileUploading/UploadFile")]
    public async Task<string> UploadFile()
    {
        var ctx = HttpContext.Current;
        var root = ctx.Server.MapPath("~/App_Data");
        var provider =
            new MultipartFormDataStreamProvider(root);

        try
        {
            await Request.Content
                .ReadAsMultipartAsync(provider);

            foreach (var file in provider.FileData)
            {
                var name = file.Headers
                    .ContentDisposition
                    .FileName;

                // remove double quotes from string.
                name = name.Trim('"');

                var localFileName = file.LocalFileName;
                var filePath = Path.Combine(root, name);

                File.Move(localFileName, filePath);
            }
        }
        catch (Exception e)
        {
            return $"Error: {e.Message}";
        }

        return "File uploaded!";
    }
}

这是我调用此 API 的表单。

<form 
    method ="post"
    enctype="multipart/form-data"
    action="https://localhost:44327/api/FileUploading/UploadFile"   
>            
    <div>
        <label for="img">Image File</label>
        <input name="img" type="file"/>
    </div>
    <div>
        <input type="submit" value="upload" />
</div>
</form>

虽然我知道这种方法不是最好的方法,并且已经与我的导师讨论了替代方法,但我们都无法弄清楚为什么会发生这个错误(我确实理解错误的含义,但我很困惑如何解决它而不采取不同的方法),尽管我们没有寻找太久。

谢谢!

编辑:按照这里的要求是我的 WebApiConfig.cs 的内容

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

标签: c#asp.net-mvc

解决方案


如果您使用的是属性路由,则不能使用常规(路由模板)路由。

删除下面,它应该工作:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

文档说您可以将两者结合起来,但这里有一个github 问题,另有说明。


推荐阅读