【问题标题】:Web API: Method Not Found and Method Not AllowedWeb API:未找到方法和不允许方法
【发布时间】:2014-12-29 18:44:33
【问题描述】:

我似乎无法对我的 Web API 控制器进行 ajax 调用。 URL 不正确(未找到方法)或出现方法不允许错误。这是我的 ajax 调用:

    $.ajax({
        url: 'server/InstallApp',
        type: 'POST',
        data: {server: serverAsJson, appWithGroup: appWithGroupAsJson},
        contentType: "application/json",
        success: InstallRequested
    });

正在从该 URL 调用该 ajax 调用:

http://serverName/PrestoWebApi/app/#/server/ApplicationServers%5E%5E8

这些是我在上述 ajax 调用中尝试使用的各种 URL,以及结果:

url: 'server/InstallApp'

POST http://serverName/PrestoWebApi/app/server/InstallApp 404 (Not Found)

请注意缺少#。不确定这是否重要。

url: '#/server/InstallApp'

POST http://serverName/PrestoWebApi/app/ 405 (Method Not Allowed)

不知道为什么 URL 会被这样截断。为什么当 URL 甚至与控制器不匹配时 Method Not Allowed?

url: '/PrestoWebApi/app/#/server/InstallApp'

POST http://serverName/PrestoWebApi/app/ 405 (Method Not Allowed)

我不确定要尝试什么。我已经用其他应用程序做到了这一点。我什至尝试输入webdav removal entries in my web.config

这是我的控制器(请注意,我可以在我的控制器中调用 Get 方法):

[EnableCors(origins: "http://serverName", headers: "*", methods: "*")]
public class ServerController : ApiController
{
    public ApplicationServer Get(string id)
    {
        // Get code here
    }

    [HttpPost]
    public void InstallApp(ApplicationServer server, ApplicationWithOverrideVariableGroup appWithGroup)
    {
        Debug.WriteLine("snuh");
    }

我很茫然。有什么想法可以尝试吗?

【问题讨论】:

  • web api 网站的 url 是什么?它与您调用它的页面相同吗?
  • Web api 应用程序应该部署到与您的 Web 项目不同的 URL,所以我不确定您为什么只是使用“路由”而不是 URL + 路由。
  • Web API 和网站在同一个 URL。有问题吗?
  • 好的,所以您是从同一个项目内的 JS 文件调用的,对吧?无论哪种方式,您的 ServerController 上都不需要 CORS 属性。
  • 我认为 CORS 属性是必要的,因为 DNS 问题:stackoverflow.com/a/26680568/279516

标签: javascript c# ajax asp.net-web-api


【解决方案1】:

您 URL 中的 # 用于客户端逻辑,很可能是路由,在您的 WebAPI 路由中完全被忽略。

即这个网址:

http://serverName/PrestoWebApi/app/#/server/ApplicationServers%5E%5E8

在服务器上被解释为这样:

http://serverName/PrestoWebApi/app/

我看到的第二个问题是,除非您在 WebApiConfig 中特别更改此设置,否则您的 WebAPI 方法不会位于 /app,而是位于 /api(或者在您的情况下可能是 /server)。您可以将您的 ajax 呼叫更改为:

$.ajax({
    url: '/PrestoWebApi/server/InstallApp', // or /PrestoWebApi/api/server/InstallApp
    type: 'POST',
    data: {server: serverAsJson, appWithGroup: appWithGroupAsJson},
    contentType: "application/json",
    success: InstallRequested
});

您可以通过转到 WebAPI 欢迎页面(可能是http://serverName/PrestoWebApi/api)并通过单击导航栏中的Api 查看帮助页面来查看 URL 的确切外观。

【讨论】:

  • 基本上,您需要删除 URL 的“/InstallApp”部分,您的应用才会被视为真正符合 Richardson 成熟度模型的第 2 级。唯一需要关注的是 HATEOS,它在您的应用设计模式中实现。
  • 他的应用是否是 RESTful 是另一个问题;这个答案是问题的原因和解决方案。不知道为什么投反对票@JustinRusso
  • 不,这也是答案的一部分。他将“[HttpPost]”属性分配给该方法,这意味着 ACTUAL URL 不应包含该操作。
  • 哦,对了。我想我有一些额外的信息,但他添加了一个额外的路由来适应 URL 的“动作”
【解决方案2】:

您的 ajax 调用的 URL 应该是“HTTP://{{domainname}}.com/api/{{controller}}”

例如,“http://myapiproject.com/api/server”...除非您的控制器位于与“Controllers”不同的目录中。

然后,由于您已经在控制器的“InstallApp”方法上设置了 HttpPost 属性,因此您只需确保将 ajax 调用中的“类型”设置设置为“POST”并且它应该路由。

这样做,您将无法拥有两个添加了 [HttpPost] 属性的方法。

【讨论】:

  • 我尝试在 ajax 调用中指定 URL,就像你说的:url: 'http://serverName/PrestoWebApi/app/#/server'。这导致了这个:POST http://serverName/PrestoWebApi/app/ 405 (Method Not Allowed)
  • 在这种情况下,您的 web api url 应该是 serverName/PrestoWebApi/app/#/api/server
  • 但是,由于您是从同一个域调用的,所以您在 ajax 请求中的 URL 应该是 '/api/server/'
  • 我网站上出现的第一页有这个 URL:http://serverName/PrestoWebApi/app/#/apps
  • 好的,那么 .ajax 调用的基本 URL 应该是 '/api/server'
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 2018-02-04
  • 2016-03-23
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2018-05-27
  • 2018-11-11
相关资源
最近更新 更多