2

问题

我们刚刚从 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}

问题

我试过以不同的顺序弄乱路线,看看这是否能解决问题而没有运气。我正在寻求以下任何解决方案的帮助:

  1. 我们路线中的一个潜在问题。
  2. 路由的替代解决方案content-typeUpload仅需要为多部分表单帖子调用该操作。如果内容类型是 JSON 或 XML,则应使用常规操作。我还没有找到任何表明可以做到这一点的资源,但我希望其他人已经考虑过这一点。
  3. 用于从请求内容中读取文件流的模型绑定方法,因此我们不再需要单独的Upload操作
4

1 回答 1

0

默认情况下,不可能在单个控制器中混合 REST 样式路由和 RPC 样式路由 - 您似乎正在尝试这样做。

在 ASP.NET Web Stack 的 codeplex 上存在一个未解决的问题,Web API 源所在的位置 - http://aspnetwebstack.codeplex.com/workitem/184

如果您想这样使用它,您需要将上传操作移动到一个单独的控制器,该控制器将以仅 RPC 的方式调用。

于 2012-09-12T06:55:26.710 回答