C# 找不到路径/api/*的控制器或该控制器未实现IController
我目前正在学习ASP.NET MVC,我被赋予了创建一个网站的任务,用户可以将文件上传到该网站 我已将以下FileUploadingController编写为API,当我尝试通过我的网站视图中的表单调用时,我会出现以下错误:“路径“/API/FileUploading/UploadFile”的控制器未找到或未实现IController。” 这是我上传用户文件的APIC# 找不到路径/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
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);