2017-08-03 99 views
1

我想指向我的行动,基本上我有1个控制器有不同的方法,我想指向不同的方法,一切运作良好,当我有1个方法称为创建,现在我有一个叫createDocument(从现在开始忽略最佳实践REST)。所以每次我需要指向createDocument它都会失败,我得到这个(邮差)。多个动作被发现匹配请求C#

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "Multiple actions were found that match the request: \r\nCreate on type server.Controllers.DocumentController\r\nCreateDocument on type server.Controllers.DocumentController", 
    "ExceptionType": "System.InvalidOperationException", 
    "StackTrace": " at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 
} 

我只是有这个在我的控制器:

public async Task<IHttpActionResult> CreateDocument([FromBody]List<DocumentDetails> details) 
{ 
    return Ok(200); 
} 

它不进入我试图调试它的控制器,我有很好的作品进入没有问题的另一种方法。

public async Task<IHttpActionResult> Create([FromBody]AppDocument document) 
     { 

我的路由配置是这样的:

namespace server 
{ 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

我怀疑它是与我收到的参数,我收到jsonArray这样的:

[ 
    { 
    "key": "Table", 
    "rows": 1, 
    "cols": 1, 
    "cells": 1 
    }, 
    { 
    "key": "Paragraph", 
    "text": "asda", 
    "fontSize": 14 
    }, 
    { 
    "key": "Paragraph", 
    "text": "asda", 
    "fontSize": 14 
    }, 
    { 
    "key": "Paragraph", 
    "text": "asda", 
    "fontSize": 14 
    } 
] 

并为此我创建了2个模型,第一个有一个简单的列表

namespace server.Models 
{ 
    public class DocumentDetails 
    { 
     public int Id { get; set; } 
     public List<DocumentAtributes> atributes { set; get; } 
    } 
} 

具有列表元素

namespace server.Models 
{ 
    public class DocumentAtributes 
    { 
     public int Id { get; set; } 
     public String key { get; set; } 
     public String rows { get; set; } 
     public String cols { get; set; } 
     public String cells { get; set; } 
     public String fontSize { get; set; } 
     public String width { get; set; } 
     public String height { get; set; } 
     public String base64 { get; set; } 
     public String align { get; set; } 
     public String text { get; set; } 
    } 
} 
+0

您显示的路线错误。如果这是web api,那么我们需要看到'WebApiConfig',它默认使用'api/{controller}/{id}'路径模板 – Nkosi

+0

您可能需要将'config.MapHttpAttributeRoutes();'添加到'WebApiConfig'中,但是如果我们能看到你的'WebApiConfig'会更好。 – Alisson

回答

1

更新WebApiConfig路径模板来识别在路由模板作为默认的约定基于路由模板动作名称中可能的道具第二个通常是api/{controller}/{id}

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}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

您还应该使用[HttpPost]属性更新动作。

public class DocumentController : ApiController { 

    [HttpPost] 
    public async Task<IHttpActionResult> CreateDocument([FromBody]List<DocumentDetails> details) { 
     //... 
    } 

    [HttpPost] 
    public async Task<IHttpActionResult> Create([FromBody]AppDocument document) { 
     //... 
    } 
} 
0

问题可能出现在您调用api的js代码中。我相信你应该声明一个方法应该如何接收请求。

实施例:

[HttpPost] 
public async Task<IHttpActionResult> CreateDocument([FromBody]List<DocumentDetails> details) 
{ 
    return Ok(); 
} 

添加HttpPost属性使得CreateDocument方法只接收post请求。

相关问题