阿贾克斯后的作品与angularjs $ HTTP不起作用瓦特/ ASP.NET MVC 4不起作用、作品、angularjs、阿贾克斯后

2023-09-13 04:53:02 作者:卑挽ゞ

我有两个项目的客户端和服务器端。客户方项目是纯粹的htmljs。服务器端是ASP.NET MVC 4和Web API。因为有两个项目,我需要启用CROS功能。我加入到服务器的 webconfig

I have two projects client side and server side. Client side project is pure htmljs. Server side is ASP.NET MVC 4 and Web Api. Because there are two projects I need to enable CROS functionality. I added into server's webconfig:

<system.webServer>
 <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

阿贾克斯后的版本这是工作:

$.post(url, appContext).done(
                function(data, textStatus, jqXHR) {
                    successFn(data, textStatus);
                })
                .fail(
                    function(jqXHR, textStatus, err) {
                        errorFn(err, textStatus);
                    });

角$ HTTP POST版本,这是不工作:

 $http({
                url: url,
                method: 'POST',
                params: { appContext: appContext },
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                    /*'Accept': 'text/json'*/}
            }).success(successFn).error(errorFn);

当我使用的$ HTTP我得到两个错误:

When I use $http I am getting two errors:

选项URL 405(不允许的方法)发布网址500(内部服务器错误)

ASP.NET MVC方法

ASP.NET MVC method is

[System.Web.Http.HttpPost]
public List<Module> GetModules([FromBody]SessionContext appContext)
{
 return  CreateModules();
}

编辑:

角车型的配置:

var emsApp = angular.module('EmsWeb', ['ui.bootstrap']);
emsApp.config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider) {

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

选项的标题要求我在浏览器中看到:

Request URL:http://localhost/EmsWeb/api/ModuleApi/GetModules?appContext=%7B%22globalDate%22%3A%22Mon%2C%2008%20Jul%202013%2013%3A09%3A35%20GMT%22%2C%22userToken%22%3A%22AlexToken%22%7D
Request Method:OPTIONS
Status Code:405 Method Not Allowed

Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
DNT:1
Host:localhost
Origin:http://localhost:50463
Referer:http://localhost:50463/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Query String Parametersview sourceview URL encoded
appContext:{"globalDate":"Mon, 08 Jul 2013 13:09:35 GMT","userToken":"AlexToken"}

Response Headers
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Content-Length:76
Content-Type:application/json; charset=utf-8
Date:Mon, 08 Jul 2013 13:09:35 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

任何想法,为什么角的方式不起作用是AP preciated?

Any ideas why angular way does not work are appreciated?

更新,因为它原来是相当愚蠢的问题:因为我用PARAMS和代替数据:

Update the issue as it turns out to be quite silly: because I used params and instead of data in:

 $http({
                url: url,
                method: 'POST',
                params: { appContext: appContext },
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                    /*'Accept': 'text/json'*/}
            }).success(successFn).error(errorFn);

角度转换成的GetRequest。不需要任何的ContentType。所以实际的code是

angular converted to GetRequest. No need for ContentType either. so actual code is

 $http({method: 'POST',
            url: url,                
            data: appCtx,
        }).success(successFn).error(errorFn);

所以几乎解决了,我看到的角仍然发出一个失败,但后请求经过...... OPTIONS请求

so ALMOST resolved, I see that angular still issues OPTIONS request that fails but post request goes through...

等等,一个任何想法都是pciated AP $ P $

so any ideas on that one are appreciated

推荐答案

我的问题是由于两方面的原因:我用PARAMS和代替数据

My issue were due to two reasons: I used params and instead of data in

 $http({
                url: url,
                method: 'POST',
                params: { appContext: appContext },
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                    /*'Accept': 'text/json'*/}
            }).success(successFn).error(errorFn);

角度转换成的GetRequest。不需要任何的ContentType。所以实际的code是

angular converted to GetRequest. No need for ContentType either. so actual code is

 $http({method: 'POST',
            url: url,                
            data: appCtx,
        }).success(successFn).error(errorFn);

在服务器端我需要的东西处理选项的要求。一种方法是修饰方法W / [System.Web.Http.AcceptVerbs(选项),我不认为最好的方式。另一种方法是将自定义消息处理程序。我还在研究它......

on the server side I needed something handling OPTIONS request. One way is to decorate method w/ [System.Web.Http.AcceptVerbs("OPTIONS")], which I do not think the best way. Another way is to add Custom Message Handler. I am still researching it...