【问题标题】:How to do an ajax post, from javascript, to a web-api service如何从 javascript 到 web-api 服务进行 ajax 发布
【发布时间】:2026-01-04 05:20:03
【问题描述】:

我正在尝试创建一种日志记录方法,该方法适用于我的所有 javascript 调用。 情况不太好。我收到以下错误:

在控制器“日志”上找不到与请求匹配的操作。

我的控制器上有以下代码:

[System.Web.Mvc.HttpPost]
        public void Post(string msg)
        {
            using (var ctx = new DataClassesDataContext(ConfigurationManager.ConnectionStrings["EasyViewDkConnectionString"].ToString()))
            {
                ctx.UserInputInsert(msg, HttpContext.Current.Request.UserHostAddress);
            }
        }

非常简单。我有点不确定我的路由是否是问题所在。基本上,我只有默认路由:

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

为了发布数据,我使用了这个 javascript:

function Log(msg) {
    $.ajax({
        url: "/api/Log/",
        data: msg,
        type: "POST",
        contentType: "application/json;charset=utf-8"
    });
}

很明显,我做错了什么。这可能是我的路由,但我似乎无法解决它。我已经尝试将控制器上的 msg 参数更改为 id,但它仍然是一样的。

【问题讨论】:

  • 我注意到您正在将[System.Web.Mvc.HttpPost] 操作过滤器应用于您的发布操作。这是错误的,不需要。 System.Web.Mvc 命名空间用于 MVC 控制器,而 System.Web.Http 命名空间用于 Web Api 控制器。名称相似,但完全不同。您确定您的控制器是 Web Api 控制器吗?
  • @Brett,是的,它是一个 Web api 控制器。我实际上把 httppost 放在那里,我想我打错了命名空间。

标签: javascript asp.net-mvc asp.net-web-api


【解决方案1】:

我已经在谷歌上搜索了一段时间,偶然发现了这篇文章: http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

事实证明,当您发布原始值(如字符串)时,Web Api 并不真正喜欢它。为了让它工作,你需要在参数中添加[FromBody],并且在发布时还有一个空值名称。

所以,我对我的代码进行了一些更改,现在它看起来像这样,并且可以正常工作。

Javascript:

function Log(msg) {
    $.post("/api/Log", { "": msg });
}

还有我的控制器:

[System.Web.Http.HttpPost]
        public HttpResponseMessage Post([FromBody]string value)
        {
            using (var ctx = new DataClassesDataContext(ConfigurationManager.ConnectionStrings["EasyViewDkConnectionString"].ToString()))
            {
                ctx.UserInputInsert(value, HttpContext.Current.Request.UserHostAddress);
            }

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

【讨论】:

  • 我很高兴这对你有用 - 但是,我在 WebAPI 中使用原始类型从来没有遇到过问题,因此我的回答是。这类问题通常归结为路由。
【解决方案2】:

过去对我有用的另一种可能性...... 您可能会考虑更改映射以包含控制器操作

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

然后将 ajax 方法中的 url 更改为 [controller]/[method]/。您还需要定义您的发布数据参数。

  $.ajax({
    url: "/api/Log/Post/", //--'Log' being the Controller, 'Post' being the method
    data: JSON.stringify({"msg":msg}),
    type: "POST",
    contentType: "application/json;charset=utf-8" 
});

希望对您有所帮助。随时通知我们!

【讨论】:

  • 我会尽量避免这种情况,因为这开始偏离 REST 风格的架构。 url 不应该包含任何类型的操作指示符(这是更多的 CRUD 风格),所有这些都应该由请求标头信息确定。
  • 关于不遵守 REST 的观点是正确的。我无法从这个问题中确定 REST 是否是正在使用的所需架构。如果是这样,您是否还需要传递主机地址以遵守 REST 的无状态特性?好奇你的想法。谢谢!
  • @bphillips,我绝对想坚持使用 REST。