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

C# 找不到路径/api/*的控制器或该控制器未实现IController,c#,asp.net-mvc,C#,Asp.net Mvc,我目前正在学习ASP.NET MVC,我被赋予了创建一个网站的任务,用户可以将文件上传到该网站 我已将以下FileUploadingController编写为API,当我尝试通过我的网站视图中的表单调用时,我会出现以下错误:“路径“/API/FileUploading/UploadFile”的控制器未找到或未实现IController。” 这是我上传用户文件的API public class FileUploadingController : ApiController { [HttpP

我目前正在学习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!";
    }
}

您不会返回任何响应。这样你的客户就会认为控制器不存在。 只需返回一个
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!")
    }
}
公共类文件上载控制器:ApiController
{
[HttpPost]
[路由(“api/FileUpload/UploadFile”)]
公共异步任务上载文件()
{
var ctx=HttpContext.Current;
var root=ctx.Server.MapPath(“~/App_Data”);
变量提供者=
新的MultipartFormDataStreamProvider(根);
尝试
{
等待请求。内容
.ReadaMultipartAsync(提供程序);
foreach(provider.FileData中的var文件)
{
var name=file.Headers
.内容处置
.文件名;
//从字符串中删除双引号。
name=name.Trim(“”);
var localFileName=file.localFileName;
var filePath=Path.Combine(根,名称);
Move(localFileName,filePath);
}
}
捕获(例外e)
{
返回$“错误:{e.Message}”;
}
返回Ok(“上传文件!”);//或返回内容(“上传文件!”)
}
}

如果使用属性路由,则不能使用传统(路由模板)路由

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

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

上面说你可以把两个结合起来,但这里有一个说法是相反的。

我们通过添加

GlobalConfiguration.Configure(WebApiConfig.Register);

到Global.asax.cs文件。

@可能是因为您正试图发布表单,但您试图命中的端点没有任何参数?例如[FormBody]。ASP.NET可能不知道如何在控制器中路由到该操作。您的路由应该是
”https://localhost:44327/FileUploading/api/FileUploading/UploadFile“
您忘记了控制器name@Train如果我像你建议的那样把路线放进去,我会出错404@nickgowdy我不太明白你的意思,你能澄清一下吗?你在App_Start文件夹的WebApiConfig.cs文件中有什么代码?我试过了,但仍然出现同样的错误。这个程序是在半成品阶段交给我的,所以我不确定为什么整个WebApiConfig说它没有使用,根据你的回答,我猜不应该是这样的?
 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
GlobalConfiguration.Configure(WebApiConfig.Register);