Ajax Post 到 Web API 成功但是.. 当托管在默认网站 (IIS) 上时在客户端失败

Ajax Post to Web API succeeds but.. fails on client side when hosted on Default Web Site (IIS)

我有一个奇怪的问题:我有一个客户端应用程序 (jquery) 运行 针对同一域中的 WebAPI。当我在本地计算机的 IIS 上托管它时,作为根网站(站点->MyApp),它工作正常(Get 和 Post)。典型的 API 调用如下所示:

$.get("api/GetList", null, function (data) {
        var list = data;
    })

但是,当我在 IIS 中将其作为子应用程序托管在 "Default Web Site" 下时,典型的 API 调用如下所示:

$.get("MyApp/api/GetList", null, function (data) {
        var list = data;
    })

所有 GET 调用都工作正常,但 POST 调用行为怪异。我像这样打 POST 电话:

$.ajax({
            url: "MyApp/api/Fields",
            type: 'POST',
            dataType: 'json',
            contentType: false,
            cache: false,
            processData: false,
            data: data,
            success: function (res) {
                var x = res;               
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //
            }
        });

Web api 方法如下所示:

[HttpPost]
[Route("api/Fields")]
public async Task<IHttpActionResult> Post() {...

当我执行 POST 调用时,它到达服务器并且服务器方法工作正常,但是当它 returns 时我得到一个错误。从这里:http://localhost/MyApp/index.html 我点击提交按钮并得到这个(即使在服务器端操作成功!!): HTTP 错误 404.0 - 未找到 请求 URL http://localhost:80/api/Fields?input_1=sometext

如您所见,到 MyApp 的路由消失了,IIS 将请求视为 GET ,尽管我做了 POST!!和 returns 到根:默认网站而不是返回到 localhost/MyApp ..

相同的代码 1:1 when 运行 在具有相同配置的 IIS 测试服务器上工作正常,没有此错误。 有什么想法吗?

网上查了无数遍都没有答案,突然看到Form标签里有一个action属性!:

<form id="Id" name="Name" action="api/action" enctype="multipart/form-data" novalidate>

一旦我删除了 action 属性,它就解决了额外的 api 调用。但我还必须防止表单的默认行为。所以我把 Ajax Post Api 调用放在 $(document).ready 函数中,如下所示:

jQuery(function ($) {
        var frm = $('#FormId');
        frm.submit(function (ev) {
            ev.preventDefault();

            //do validation etc..

            //do Ajax Post
            $.ajax({
                url: "api/Fields/",
                method: 'POST',
                dataType: 'json',
                contentType: false,...
            });
            return false;
        });
  });

不要忘记阻止表单默认行为!