【问题标题】:The Controller for path /api/* was not found or does not implement IController路径 /api/* 的控制器未找到或未实现 IController
【发布时间】:2019-12-12 15:10:59
【问题描述】:

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

我已将以下 FileUploadingController 作为 API 编写,当我尝试通过我的网站视图中的表单调用时,我收到以下错误:'The controller for path '/api/FileUploading/UploadFile' was未找到或未实现 IController。'

这是我上传用户文件的 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 }
        );
    }
}

【问题讨论】:

  • @可能是您尝试发布表单但您尝试点击的端点没有任何参数?例如 [FormBody]。 ASP.NET 可能不知道如何在您的控制器中路由到该操作。
  • 你的路由应该是"https://localhost:44327/FileUploading/api/FileUploading/UploadFile" 你忘记了控制器名称
  • @Train 如果我按照您的建议输入路线,我会收到错误 404
  • @nickgowdy 我不确定我理解你的意思,请你澄清一下吗?
  • App_Start文件夹的WebApiConfig.cs文件里有什么代码?

标签: c# asp.net-mvc


【解决方案1】:

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

删除下面,它应该可以工作:

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

documentation 表示您可以将两个组合在一起,但这里有一个 github issue 另有说明。

【讨论】:

  • 这个程序让我在半完成阶段工作,所以我不确定为什么整个 WebApiConfig 都说它没有使用,根据你的回答我猜这不应该是情况如何?
【解决方案2】:

我们通过添加解决了这个问题

GlobalConfiguration.Configure(WebApiConfig.Register);

到 Global.asax.cs 文件。

【讨论】:

    【解决方案3】:

    您不返回任何响应。这样您的客户就会认为控制器不存在。 只需返回ActionResult。这应该可以解决问题。

        public class FileUploadingController : ApiController
    {
        [HttpPost]
        [Route("api/FileUploading/UploadFile")]
        public async Task<ActionResult> 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 Ok("File uploaded!"); //or return Content("File uploaded!")
        }
    }
    

    【讨论】:

    • 我试过了,但我仍然遇到同样的错误。
    猜你喜欢
    • 2016-11-26
    • 2012-12-10
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多