我有一个ASP.NET MVC应用程序,它调用了我的Web API(在同一个应用程序中)。在大多数情况下,这样可以正常工作,但是对于这种情况,当我尝试POST一些数据时,我得到一个状态代码为302的响应,它将我重定向到相同的URL但现在使用GET(由于此API仅接受POST,这显然会失败) 。
经过多次来回,我结束了一个简单的例子,用jquery.ajax()创建的POST得到200,但是用angularJS.http()做的同一个POST得到302.
然后我将我的代码部署到我们的开发服务器,结果恰恰相反。 AngulasJS-POST获得200但jQuery-POST获得302.所以我想在调用和可能的一些IIS设置中可能存在问题?我在本地和我的服务器上使用IIS 8.5。有什么想法吗?
以下是我用来测试的代码:
Web API
public class TestController : ApiController
{
[HttpPost]
public string Post()
{
return "ok from server";
}
}
客户代码:
// jQuery - working -> Response: HTTP/1.1 200 OK
$.ajax({
type: "POST",
url: "/my/api/test",
data: JSON.stringify({ some: "data" }),
contentType: "application/json;charset=utf-8",
dataType: "json"
});
// Angular - not working -> Response: HTTP/1.1 302 Found (redirect location: /my/api/test)
$http({
method: "POST",
url: "/my/api/test",
data: { some: "data" }
});
请求(在Fiddler中):
jQuery调用
POST http://localhost/my/api/test HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json;charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost/my/test
Accept-Language: nb-NO
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: localhost
Content-Length: 15
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
Cookie: FedAuth=77u/PD94bWwg...PjwvU2VjdXJpdHlDb250ZXh0VG9rZW4+; __utma=1.1704028259.1410177772.1421917753.1421924481.153; __utmz=1.1410177772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=aig50hiuqza5bjs4nasq1h4q
{"some":"data"}
Angular call
POST http://localhost/my/api/test HTTP/1.1
Content-Type: application/json;charset=utf-8
Accept: application/json, text/plain, */*
Referer: http://localhost/my/test
Accept-Language: nb-NO
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
Content-Length: 15
DNT: 1
Host: localhost
Pragma: no-cache
Cookie: __utma=1.1704028259.1410177772.1421917753.1421924481.153; __utmz=1.1410177772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=aig50hiuqza5bjs4nasq1h4q
{"some":"data"}
答案 0 :(得分:0)
尝试将[HttpPost]
属性添加到控制器操作中:
public class TestController : ApiController
{
[HttpPost]
public string Post()
{
return "ok from server";
}
}
答案 1 :(得分:0)
我发现请求中有一点不同,我怀疑这可能是答案。 cookie包含一个用于授权的FedAuth令牌(我们使用WIF),并且在所有失败的POST(jQuery或AngularJS)中都缺少这个。我还没弄清楚为什么有时会包含这种情况,有时也不会,但我认为这是导致重定向的原因(可能是我们的LoginManager,但为什么它没有显示在我不知道的302响应上)。
也许我应该为此发布一个新问题,但有没有人建议为什么只包含在某些电话中?