对iis的POST被重定向到具有相同URL的GET

时间:2015-02-20 12:35:19

标签: angularjs iis http-status-code-302

我有一个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"}

2 个答案:

答案 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响应上)。

也许我应该为此发布一个新问题,但有没有人建议为什么只包含在某些电话中?