Web API 2 - Error: "No type was found that matches the controller named 'resize'."

Web API 2 - Error: "No type was found that matches the controller named 'resize'."

我正在尝试使用 Web API 进行简单的文件上传 API。

这是控制器:

[RoutePrefix("api/resize")]
public class ResizeController : ApiController
{

    [HttpPost, Route("api/resize/preserveAspectRatio")]
    public async Task<IHttpActionResult> resizePreserveAspectRatio()
    {
        if (!Request.Content.IsMimeMultipartContent())
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

        int maxWidth = 100;
        int maxHeight = 100;

        var provider = new MultipartMemoryStreamProvider();
        await Request.Content.ReadAsMultipartAsync(provider);
        foreach (var file in provider.Contents)
        {
            var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
            var buffer = await file.ReadAsByteArrayAsync();
            //Do whatever you want with filename and its binaray data.


        }

        return Ok();
    }


}

这是我的 WebApiConfig:

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 }
        );
    }
}

当我使用 PostMan POST 一个文件时,这是我得到的错误:

{
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:26303/api/resize/preserveAspectRatio'.",
    "MessageDetail": "No type was found that matches the controller named 'resize'."
}

这不是一个骗局 - 找不到另一篇文章来解决这个特定的组合。

如您所料,这是路由问题。评论已经确定您与您的路线和路线前缀属性发生冲突导致以下路线

api/resize/api/resize/preserveAspectRatio

映射到您的操作。

要获得所需的路由,您可以从控制器本身删除前缀。

//removed prefix
public class ResizeController : ApiController {
    //Matches POST api/resize/preserveAspectRatio
    [HttpPost, Route("api/resize/preserveAspectRatio")]
    public async Task<IHttpActionResult> resizePreserveAspectRatio() {
        //...removed for brevity
    }
}

或者从方法的路由中移除它

[RoutePrefix("api/resize")]
public class ResizeController : ApiController {
    //Matches POST api/resize/preserveAspectRatio
    [HttpPost, Route("preserveAspectRatio")]
    public async Task<IHttpActionResult> resizePreserveAspectRatio() {
        //...removed for brevity
    }
}

或者通过在方法属性上使用代字号 (~) 覆盖路由前缀

[RoutePrefix("api/resize")]
public class ResizeController : ApiController {
    //Matches POST api/resize/preserveAspectRatio
    [HttpPost, Route("~/api/resize/preserveAspectRatio")]
    public async Task<IHttpActionResult> resizePreserveAspectRatio() {
        //...removed for brevity
    }
}

引用Attribute Routing in ASP.NET Web API 2