找不到路径/ api / *的控制器或未实现IController

时间:2019-12-12 15:10:59

标签: c# asp.net-mvc

我目前正在学习ASP.NET MVC,并且已获得创建网站的功能,用户可以在该网站上上传文件。

我编写了以下FileUploadingController作为API,当我尝试通过视图中的表单为网站调用时,出现以下错误:'路径'/ api / FileUploading / UploadFile的控制器是找不到或未实现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 }
        );
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

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

documentation说您可以将两个结合起来,但是这里的github issue则相反。

答案 1 :(得分:1)

我们通过添加

解决了该问题
GlobalConfiguration.Configure(WebApiConfig.Register);

到Global.asax.cs文件。

答案 2 :(得分:0)

您不返回任何回复。这样,您的客户认为该控制器不存在。  只需返回一个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!")
    }
}