如何在 IIS 8.x 或更高版本上允许本地和远程的 POST、PUT

Posted

技术标签:

【中文标题】如何在 IIS 8.x 或更高版本上允许本地和远程的 POST、PUT【英文标题】:How to allow POST, PUT on IIS 8.x or higher for both localhost and remote 【发布时间】:2017-01-19 05:41:41 【问题描述】:

我的 $http.POST() 使用 Angular 1.5,一切正常,但我不断收到此错误:

**GENERAL**
Request URL:http://localhost/ThingBlu/OmniGrow/js/json/logged-users.json
Request Method:POST
Status Code:405 Method Not Allowed
Remote Address:[::1]:80

**Response Headers**
Allow:GET, HEAD, OPTIONS, TRACE
Cache-Control:private
Content-Length:5448
Content-Type:text/html; charset=utf-8
Date:Sun, 11 Sep 2016 18:08:27 GMT
Server:Microsoft-IIS/10.0
X-Powered-By:ASP.NET

**Request Headers**
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Authorization:Basic OWFjMTIwMTAtNjhmZC00YTY4LWIxMTQtMTI3NjcyYmRkMmNkOjRmOGJkMDg0LTY2NDQtNDVmMi1iNGI4LWI4OTgwNzgyMDkzZA==
Connection:keep-alive
Content-Length:305
Content-Type:application/json;charset=UTF-8
Cookie:XDEBUG_SESSION=XDEBUG_ECLIPSE; ASPSESSIONIDQARBBSBC=LGJPEMMBPPMIKGAEMPOKDDKP; ASPSESSIONIDQAQBBRDC=HNLHMCECDLFMFBMOFMNFNNEA; ASPSESSIONIDSARCBSBD=DMGPJIECDOKINIEIIADELBOG; ASPSESSIONIDSCQBCQCD=HHHNEBHCACCJABGNFAMFHNAD; ASPSESSIONIDQATBARBD=KFNLJLHCMOECJOMCDDOFBINL; ASPSESSIONIDQCSABTAC=GDGJMOMCNPDBJAAOKJJHDDGH
DNT:1
Host:localhost
Origin:http://localhost
Referer:http://localhost/ThingBlu/OmniGrow/index.html
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36

问题来了:

我的 WebConfig 文件有以下内容:

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>

每当我单步执行下面的代码并点击特定部分时,就会发生上述错误。

我正在写入本地 JSON 文件,这是我在 Frontier Communications 工作时成功完成的。这很可能让大多数帖子感到懊恼,说它不是。我已经做到了,FRONTIER 和 T-MOBILE 也是如此。话虽如此,这是我的 ANGULAR 代码:

            /**
             * Then log the person in
             * @returns object through promises
             */
            ctrlLogin.fetchLogin = function () 

                //SUBMIT FORM
                $scope.submit = function () 
                    console.log('Submit Clicked');
                    //Encode Password if FormData is VALID
                    if ($scope.formData) 
                        formObj = 
                            uid: $scope.formData.myusername,
                            pwd: $scope.encode64($scope.formData.mypassword),
                            rmbr: $scope.formData.rememberme
                        ;
                        //Login Data
                        loginData.svc.getLoginData(formObj).then(function (result) 
                            console.log("Login message: ", result);
                            //if success send the person through
                            if (result.data.message === "failure") 
                                console.log("ERROR: ", result.data.message);
                                $scope.changeRoute("/error");
                             else 
                                console.log("SUCCESS: ", result.data);

                                //Get Path to JSON
                                $http.get(SVCURLS.data.loggedusers).then(function (data) 
                                    //SUCCESS so therefore pass ACTIVE = 1 for DASHBOARD as that's
                                    //where we're going next.
                                    if (appservice.appFuncs.saveToJson(result.data, 1)) 

                                        data.users = angular.toJson(result.data);
                                        //use $.param JQUERY function to serialize the data from JSON
                                        $scope.users = $.param(data.users);
                                        //CONFIG using HEADERS
                                        var config = HEADERS.tokenheaders;
                                        **//NOTE: THIS IS THE POINT AT WHICH THE 405 ERROR OCCURS**
                                        $http.post(SVCURLS.data.loggedusers, data.users, status, config)
                                                .success(function (data, status, headers, config) 
                                                    //SUCCESS CALBACK
                                                    $scope.PostDataResponse = data;
                                                    console.log("SUCCESS Writing to JSON FILE!");
                                                    window.location.href = "main-page.html";
                                                )
                                                .error(function (data, status, headers, config) 
                                                    //FAILURE CALLBACK
                                                    $scope.PostDataResponse = "DATA: " + data +
                                                            "<hr/>Status: " + status +
                                                            "<hr/>Headers: " + headers +
                                                            "<hr/>Config: " + config;
                                                    console.log("ERROR Writing to JSON FILE");
                                                    return deferred.reject(data ? data : '[NO DATA]');
                                                );
                                     else 
                                        //ERROR show what happened
                                        console.log("ERROR: ", data);
                                        //Now flip the pages that the session has been
                                        //Created
                                        $scope.msg = "There was an error saving your information.";
                                        deferred.reject(data ? data : '[NO DATA]');
                                    
                                );
                            
                        );
                    
                    return "intial load";
                ;
            ;
            ctrlLogin.fetchLogin();

我们将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

可能是其他模块(不是 WebDAV)有冲突的动词过滤器。 您可以尝试查看 iis config 文件夹中 applicationHost.config 文件的内容。可疑模块是具有相同路径和相似动词的模块。例如,如果某个模块 X 在 IIS 管理控制台中为您的应用程序禁用,但在 applicationHost.config 中定义了匹配的路径/动词过滤器,则它的处理程序仍将作为请求管道的一部分被调用,并且该模块将生成405 状态。 如果您发现任何冲突的模块,您可以将它们从管道中删除,类似于您在 web.config 文件中为 WebDAV 执行的操作。

【讨论】:

以上是关于如何在 IIS 8.x 或更高版本上允许本地和远程的 POST、PUT的主要内容,如果未能解决你的问题,请参考以下文章

如何使使用旧 Java 版本开发的应用程序在 jdk 9 或更高版本上运行? [复制]

如何在 xCode 4 或更高版本中添加或连接两个项目,例如一个项目

解决IIS发布网站出现"System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本"的问题

在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

语义版本控制问题和 npm 5 或更高版本

如何在 Android SDK 26 或更高版本上以编程方式重置锁屏密码