我有一个奇怪的问题:我有一个针对同一域上的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正常工作,没有此错误。 有什么想法吗?
答案 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;
});
});
不要忘记阻止表单默认行为!