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

时间:2017-02-08 12:48:20

标签: ajax iis-7 localhost asp.net-web-api2

我有一个奇怪的问题:我有一个针对同一域上的WebAPI运行的clientSide App(jquery)。当我在本地计算机上的IIS上托管它时,作为Root网站(Sites-> MyApp),它可以正常运行(Get和Post)。典型的API调用如下所示:

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

但是,当我在"默认网站"在IIS中,作为子应用程序,典型的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调用时,它会到达服务器并且服务器方法正常工作,但是当它返回时我得到一个错误。从这里:http://localhost/MyApp/index.html我单击提交按钮并获取此信息(即使操作在服务器端成功!!): HTTP错误404.0 - 未找到 请求的网址http://localhost:80/api/Fields?input_1=sometext

所以你可以看到,MyApp的路由消失了,IIS处理请求,因为它是GET,虽然我做了一个POST!并返回到根:默认网站,而不是返回到localhost / MyApp ..

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

1 个答案:

答案 0 :(得分:0)

经过无数次调查,网上没有回复,我突然发现Form标签包含一个动作属性!:

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

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