问题
我们刚刚从 MVC4 Web API Beta 切换到 RC,并且Multiple actions were found that match the request ...
在我们的服务中遇到了异常。
背景
我们在POST
中定义了两个动作ApiController
:
public class MyModelController : ApiController
{
...
// POST /mymodel
public MyModel Post(MyModel model)
{
...
}
// POST /mymodel/upload
[ActionName("Upload")]
public HttpResponseMessage UploadModelImage()
{
HttpRequestMessage request = Request;
if (!request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType, request));
}
...
}
}
第一个操作(默认POST
操作)用于MyModel
从传递给服务的 JSON 创建一个新对象。我们门户的用户可以选择上传图像作为创建新MyModel
对象的一部分,在这种情况下,我们使用第二个Upload
操作来保存文件并将新对象保存到数据库中。此操作读取多部分请求内容,解析模型的属性并将上传的图像保存到我们的 CDN。
自从我们切换到 RC 后,上传操作 (http://www.myapidomain.com/mymodel/upload) 运行良好,但常规POST
操作 (http://www.myapidomain.com/mymodel/) 失败了Multiple actions were found that match the request ...
引用上面列出的两种方法作为冲突的异常。
以下是我们的路线:
routes.MapHttpRoute(
"Default", // route name
"{controller}" // route template
);
routes.MapHttpRoute(
"OnlyId", // route name
"{controller}/{id}", // route template
new {}, // defaults
new {controller = @"[^0-9]+", id = @"[0-9]+"} // constraints
);
routes.MapHttpRoute(
"OnlyAction", // route name
"{controller}/{action}", // route template
new {}, // defaults
new {controller = @"[^0-9]+", action = ActionNameConstraint.Instance} // constraints
);
routes.MapHttpRoute(
"DependantAction", // route name
"{controller}/{principalId}/{action}/{dependentId}", // route template
new {dependentId = System.Web.Http.RouteParameter.Optional}, // defaults
new {controller = @"[^0-9]+", action = ActionNameConstraint.Instance} // constraints
);
ActionNameConstraint
只是一个自定义约束,确保{action}
必须属于{controller}
问题
我试过以不同的顺序弄乱路线,看看这是否能解决问题而没有运气。我正在寻求以下任何解决方案的帮助:
- 我们路线中的一个潜在问题。
- 路由的替代解决方案
content-type
。Upload
仅需要为多部分表单帖子调用该操作。如果内容类型是 JSON 或 XML,则应使用常规操作。我还没有找到任何表明可以做到这一点的资源,但我希望其他人已经考虑过这一点。 - 用于从请求内容中读取文件流的模型绑定方法,因此我们不再需要单独的
Upload
操作