HTTP Post发送到Web API 2-已收到Options请求并进行处理,无进一步请求收到。

17

我有一个使用MVC和AngularJS的Web应用程序,它连接到一个Web API 2 API,该API我已经在另一个项目中设置好。

目前,我可以毫无问题地从API检索信息。

然而,当我尝试进行HTTP Post时,我没有得到任何响应,最初我遇到了预飞请求失败的问题,现在我已经在我的控制器中处理了这个问题,但是在收到OK消息后,它并没有发送正确的请求。

我已经包括了我的Angular Factory和C# API Controller的代码。

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class RegisterController : ApiController
{
    public string Post()
    {

        return "success";
    }

    public HttpResponseMessage Options()
    {
        return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
    }
}


var RegistrationFactory = function($http, $q, ApiAddress) {
return function(model) {
   // $http.post(ApiAddress.getApiAddress() + '/Register/Post', model.ToString());

    $http({
        method: "POST",
        url: ApiAddress.getApiAddress() + '/Register/Post',
        data: model,
        headers: { 'Content-Type': 'application/json; charset=utf-8' }
    }).success(function(data) {
        $location.path("/");
    });
}
};

RegistrationFactory.$inject = ['$http', '$q', 'ApiAddress'];

编辑:

我仍然在努力解决这个问题,但我已经在Internet Explorer中进行了测试,没有任何问题。

通过禁用Web安全性,我已经让它在Chrome上运行,然而这显然不是理想的,因为��不能在启用安全性的用户PC上工作。


它在Firefox中工作吗? - DermFrench
你尝试过将发布到域名下,例如web.domain.com和api.domain.com,以查看它们在同一域名下是否能正常工作吗? - DermFrench
是的,同样的问题仍然存在。 - Ben Sharpe
你是否尝试过实际发送一些内容回来,而不仅仅是状态码?一些XHR包装器将空响应(即使状态码为200)视为请求失败。 - Knelis
1
@BenSharpe,我认为您在api控制器中不需要Options方法。如果启用了跨域的cors,则在主请求(在您的情况下为POST)之前会自动发送OPTIONS请求以获得服务器的“批准”。 - hazjack
显示剩余3条评论
3个回答

4

我看到您在服务器端进行了CORS适配。但是我没有看到任何客户端(JavaScript)适配。也许在调用服务之前,您应该添加以下代码。

$http.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

请告诉我这是否解决了问题。在所有情况下都对我有效 :)


你_可能_还需要添加$httpProvider.defaults.withCredentials = true; - glennanthonyb

1
“很奇怪你的GET请求可以正常工作,但POST请求不行。
我建议在启用网络安全性的情况下使用Google Chrome运行代码(这样我们就可以看到它出错了),并显示F12开发人员选项。
选择“网络”选项卡,运行您的代码,并观察调用POST时会发生什么。
您的服务是否返回“200 OK”状态,还是其他值?
是否返回任何类型的响应?
这可能值得一试,并在原始问题中附加结果的截图。这可能有助于确定原因。
顺便说一句,您的公司没有设置任何单点登录吧?我们曾经遇到过IE可以正常工作,但其他浏览器不允许单点登录的问题。只是一个想法...”

0

CORS需要一个OPTIONS预检请求,其响应中的HTTP头告诉浏览器是否允许访问该资源。

例如,HTTP响应头:

Access-Control-Allow-Headers: authorization
Access-Control-Allow-Origin: *

由于您在C#控制器中有一个自定义的Options处理程序,似乎这些HTTP头未返回,导致浏览器在预检后无法发出调用。

避免使用Options方法,您就可以解决问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接