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