在C#WebApi上找不到404

在C#WebApi上找不到404,c#,asp.net,asp.net-web-api2,C#,Asp.net,Asp.net Web Api2,我有一个从ApiController继承的类,它的一些方法被正确调用,另一些方法被未找到。我不知道为什么。我已经找了几个小时的解决方案了,但还是没有找到。请注意,我是新手,这是我在C#中的第一个WebApi 路由:(WebApiConfig.cs) 控制器: public class ExchangeController : ApiController { public HttpResponseMessage GetMailHeader(int id) { Con

我有一个从
ApiController
继承的类,它的一些方法被正确调用,另一些方法被
未找到
。我不知道为什么。我已经找了几个小时的解决方案了,但还是没有找到。请注意,我是新手,这是我在C#中的第一个WebApi

路由:(WebApiConfig.cs)

控制器:

public class ExchangeController : ApiController
{
    public HttpResponseMessage GetMailHeader(int id)
    {
        Console.WriteLine(id);
        HttpResponseMessage response = new HttpResponseMessage();

        response.Content = new StringContent("ok");

        return response;
    }

    public HttpResponseMessage GetTest()
    {
        HttpResponseMessage response = new HttpResponseMessage();

        response.Content = new StringContent("working !!");

        return response;
    }
}
JS:


getTest
方法返回
200ok
,而
getMailHeader
返回
404notfound
。我遗漏了什么?

据我所知,数据添加了一个查询字符串,而不是url本身的一部分。您将id定义为url的一部分,因此正确的url是/api/exchange/getmailheader/42。
您还可以将id移出routeTemplate。

因为您的方法以“Get”开头,并且没有特定属性,所以框架假定它是一个
HttpGet
(请参见下面的规则2),这要求
id
是url的一部分(基于默认路由)

如果您希望它是一个
HttpPost
(您可以像现在一样在主体中传递一个json对象),那么在方法上方添加一个
[HttpPost]
属性,或者删除操作名称的“Get”部分

HTTP方法。该框架只选择与目标匹配的操作 请求的HTTP方法,确定如下:

  • 您可以使用一个属性指定HTTP方法:AcceptVerbs, HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost或 HttpPut
  • 否则,如果控制器方法的名称以“Get”、“Post”、“Put”、“Delete”、“Head”、“Options”或“Patch”开头,则 按照惯例,该操作支持该HTTP方法
  • 如果以上都没有,则该方法支持POST

  • 感谢大家的评论和回答,这让我找到了解决方案

    我错过了编写我的
    ajax
    请求。我没有从控制台
    console.log
    获得任何打印数据,正如@Ahmedilyas所说,
    数据
    属性写得很糟糕

    以下工作:

    $.ajax({
        type: "GET",
        url: "/api/exchange/getTest"
    })
    .done(function (data) {
        console.log(data);
    });
    
    $.ajax({
        type: "GET",
        url: "/api/exchange/getMailHeader",
        data: { id: 42 }
    })
    .done(function (data) {
        console.log(data);
    });
    

    这是一个很小的步骤,但我发现自己在其中遇到了麻烦:重新构建所有解决方案,然后再次部署。getMailHeader的数据不正确。您应该这样做:data:{id:42}(将其作为JSON传递)@Ahmedilyas这实际上是问题的一部分,它引导我找到了解决方案!;)我保留了路由的
    {id}
    ,因为在执行
    GET
    方法时,我不知道如何以任何其他方式向url发送额外数据。不过,如果我可以从ajax
    data
    属性发送所需的所有数据,我可能会删除它。
    $.ajax({
        type: "GET",
        url: "/api/exchange/getTest",
        done: function (data) {
            console.log(data);
        }
    });
    
    $.ajax({
        type: "GET",
        url: "/api/exchange/getMailHeader",
        data: "42",
        done: function (data) {
            console.log(data);
        }
    });
    
    $.ajax({
        type: "GET",
        url: "/api/exchange/getTest"
    })
    .done(function (data) {
        console.log(data);
    });
    
    $.ajax({
        type: "GET",
        url: "/api/exchange/getMailHeader",
        data: { id: 42 }
    })
    .done(function (data) {
        console.log(data);
    });