请求的资源在发送 multipart-form 数据时不支持 http 方法 'POST'

The requested resource does not support http method 'POST' when sending multipart-form data

我有如下控制器:

[RoutePrefix("api/File")]
public class FileController : ApiController
{
        [HttpPost]
        [Route("Add")]        
        public async Task<HttpResponseMessage> AddFile()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
            }

            string root = HttpContext.Current.Server.MapPath("~/temp/uploads");
            var provider = new MultipartFormDataStreamProvider(root);
            var result = await Request.Content.ReadAsMultipartAsync(provider);

            foreach (var key in provider.FormData.AllKeys)
            {
                foreach (var val in provider.FormData.GetValues(key))
                {
                    if (key == "companyName")
                    {
                        var companyName = val;
                    }
                }
            }


            //Do whatever you want to do with your file here

            return this.Request.CreateResponse(HttpStatusCode.OK, "OK");
        }
}

如果我在 postman 中执行 post 请求,如图所示:

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.MapHttpAttributeRoutes();

        // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
        // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
        // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
        //config.EnableQuerySupport();

        // To disable tracing in your application, please comment out or remove the following line of code
        // For more information, refer to: http://www.asp.net/web-api
        config.EnableSystemDiagnosticsTracing();
        config.Formatters.Add(new BrowserJsonFormatter());
    }
}

函数没有命中
知道我做错了什么吗?

您似乎在使用属性路由。检查以确保属性路由已启用。

WebApiConfig.cs

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

可能是您没有启用它,并且基于约定的路由无法将路由与 HTTP 方法匹配。

尝试更改注册属性路由的顺序:

// This must come first
config.MapHttpAttributeRoutes();

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

此外,如果您总是使用基于属性的路由,我建议您删除默认路由注册。