【问题标题】:404 Not found on C# WebApi404 在 C# WebApi 上找不到
【发布时间】:2015-09-29 08:06:40
【问题描述】:

我有一个继承自ApiController 的类,它的一些方法被正确调用,另一些是Not found。我不知道为什么。我一直在寻找解决方案几个小时,仍然没有得到它。请注意,我是新手,这是我在 C# 中的第一个 WebApi。

路由:(WebApiConfig.cs)

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Configuration et services API Web

            // Itinéraires de l'API Web
            config.MapHttpAttributeRoutes();

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

控制器:

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:

$.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);
    }
});

getTest 方法返回 200 OK,而 getMailHeader 返回 404 Not Found。我错过了什么?

【问题讨论】:

  • 微不足道的步骤,但我发现自己陷入了困境:重建所有解决方案,然后再次部署。
  • getMailHeader 的数据不正确。你应该这样做: data: { id: 42 } (将其作为 JSON 传递)
  • @Ahmedilyas 这实际上是问题的一部分,它让我找到了解决方案! ;)

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


【解决方案1】:

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

【讨论】:

  • 我保留了路由的{id},因为当我执行GET 方法时,我不知道如何以任何其他方式将额外数据发送到url。虽然如果我可以从 ajax data 属性发送我需要的所有数据,我可能会删除它。
【解决方案2】:

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

如果您希望它是 HttpPost(您可以像现在一样在正文中传递一个 json 对象),然后在您的方法上方添加一个 [HttpPost] 属性或删除操作的“获取”部分名字

Reference

HTTP 方法。框架只选择与 请求的HTTP方法,确定如下:

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

【讨论】:

    【解决方案3】:

    感谢大家的cmets和答案,它使我找到了解决方案。

    我错过了写我的ajax 请求。我没有从console.log 得到控制台上的任何打印数据,正如@Ahmedilyas 所说,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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2014-02-15
      相关资源
      最近更新 更多