【问题标题】:Not able to find Web API route?找不到 Web API 路由?
【发布时间】:2020-04-20 05:38:10
【问题描述】:

我很难弄清楚为什么我无法到达 API 端点。我正在构建一个 Web API,它将调用另一个本地 API,并且从我看到的所有内容来看,它应该到达终点,我正在寻找任何想法。

这是原始 API 中的代码。我正在使用 RestSharp 拨打电话。

string jsonToSend = JsonConvert.SerializeObject(m);

var request = new RestRequest("CheckForDuplicateID", Method.POST);     
request.AddParameter("application/json; charset=utf-8", jsonToSend, ParameterType.RequestBody);
request.RequestFormat = DataFormat.Json;
request.AddParameter("CandidateID", m.CandidateID);     
request.AddParameter("FirstName", m.FirstName);         
request.AddParameter("LastName", m.LastName);

var client = new RestClient("http://localhost:60077/api/IDM/");
var content = client.Execute(request).Content;

这是我试图到达的辅助 API 中的终点。

[HttpPost]
public static DuplicateCheck CheckForDuplicateID([FromBody] DuplicateCheck m)
{
    ....code 
}

这是我的 RouteConfig.cs 文件。我已经尝试了两种路线,但都没有。

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

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

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

当我在本地启动辅助 API 时,它在 localhost:60077 上运行,我在上面进行了硬编码。我的控制器的名称是 IDMController,这是我收到的消息,但 URL 对我来说是正确的。

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

【问题讨论】:

    标签: c# asp.net asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

    操作必须是ApiController 的实例成员,而不是static

    [HttpPost]
    public DuplicateCheck CheckForDuplicateID([FromBody] DuplicateCheck m) {
        ....code 
    }
    

    因为属性路由是用

    启用的
    config.MapHttpAttributeRoutes();
    

    考虑在 API 控制器上使用属性路由来获得所需的行为

    [RoutePrefix("api/IDM")]
    public class IDMController : ApiController {
    
        //...
    
        //POST api/IDM/CheckForDuplicateID
        [HttpPost]
        [Route("CheckForDuplicateID")]
        public DuplicateCheck CheckForDuplicateID([FromBody] DuplicateCheck m) {
            ....code 
        }
    }
    

    参考Attribute Routing in ASP.NET Web API 2

    【讨论】:

    • 我将此添加到操作的顶部,但似乎也不起作用。找不到路线的相同消息。 [HttpPost] [Route("api/IDM")]
    • @Caverman 仔细检查提供的答案。注意使用的属性,并且操作不应该是static
    • 感谢您的帮助!回去查看我在做什么并再次阅读答案。像你说的那样添加了 Route 和 RoutePrefix 并删除了静态声明。起初它没有用,但幸运的是你提到它应该是 ApiController。这让我回头看看我是从 BaseController 继承的,而那个控制器是“Controller”类型而不是“ApiController”。更改为 ApiController 并且它起作用了。对我来说很好的学习时刻!
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2014-12-31
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多