显示了POST请求不允许的方法的CORS实现

时间:2019-05-27 12:40:20

标签: c# asp.net angularjs wcf .net-framework-version

我正在尝试使用另一个项目的Http POST请求调用WCF服务方法,它允许GET请求,但是当我尝试发布请求时,它显示“不允许使用方法”

当我尝试时,它在控制台中显示此错误:

  

从原点“ http://localhost:64460/Service1.svc/saveSTUDENTWithPost/WithParameter”到“ http://localhost:61174”的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。

然后我尝试使用“ System.Web.Http.Cors ”在WCF服务项目中实施CORS,但是我收到了与上述相同的错误。

我的请求显示如下:

一般:

Request URL: http://localhost/Service1.svc/saveWithPost
Request Method: OPTIONS
Status Code: 405 Method Not Allowed
Remote Address: [::1]:64460
Referrer Policy: no-referrer-when-downgrade**

请求头:

Access-Control-Allow-Headers: X-Requested-With,Content-Type
Access-Control-Allow-Origin: *
Access-Control-Request-Method: POST,GET,PUT,DELETE,OPTIONS
Allow: POST
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Date: Mon, 27 May 2019 11:42:41 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
X-SourceFiles: =?UTF-8?B?QzpcRGV2ZWxvcG1lbnRcQ09SU0V4YW1wbGVcQ09SU0V4YW1wbGVcU2VydmljZTEuc3ZjXHNhdmVTVFVERU5UV2l0aFBvc3RcV2l0aFBhcmFtZXRlcg==?=**

这是我用来启用CORS的代码:

using  System.Web.Http.Cors;
Public class APIconfig{
   public static void Register(HttpConfiguration config)
        {

            AddRoutes(config);

            EnableCorsAttribute cors = new 
                 EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
        }
}

这是Service.svc中的代码

 public class Service1 : IService1
    {
        public Stream saveWithPost(StudentData oDocumentsData)
        {

            Stream oStream = null;
            //Doing Some operation with StudentData 

            String Result = "Success";

            oStream = CommonUtility.ConvertStringToStream(Result);
            return oStream;
        }

        [DataContract(Namespace = "")]
        public class StudentData
        {
            [DataMember(Order = 0)]
            public int iStudentID { get; set; }

        }
     }

这是IService1.cs中的代码

[OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "saveWithPost/WithParameter")]
    Stream saveWithPost(Service1.StudentData oDocumentsData);

这是我从js页面使用HTTP POST调用服务的方式

var sURL = 
      "http://localhost/Service1.svc/saveWithPost/WithParameter";
var oStudentData =
{
    iStudentID: "1"   
};

$http.post(sURL, oStudentData, null)
.success(function (data, status, headers, config) {
    $scope.DOCUMENTSAVERESPONSE = data;
})

预期结果:它应该允许POST请求,而我需要从该方法获取返回值。

实际结果:

  

选项http://localhost/Service1.svc/saveWithPost/WithParameter 405   (不允许使用方法)

     

在以下位置访问XMLHttpRequest   原产地的“ http://localhost/Service1.svc/saveWithPost/WithParameter”   “ http://localhost”已被CORS政策屏蔽:对   飞行前请求未通过访问控制检查:它没有   HTTP正常状态。

2 个答案:

答案 0 :(得分:0)

您启用了Cors属性,当您查看documentation MSDN时,您将看到必须在类或方法上方提供该属性。 下面的代码允许将该类中的所有方法称为跨域。

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class Service1 : IService1
{
  // Details omitted
}

下面的代码为GetAllStudents方法启用cors。

public class Service1 : IService1
{
  [EnableCors(origins: "*", headers: "*", methods: "*")]
  List<string> GetAllStudents()
  {
    // Details omitted
  }
}

答案 1 :(得分:0)

我自己在CORS方面遇到问题,这是我在asp.net中所做的(根据您的标签来判断):

  • 我已经安装了以下NuGet软件包:
      

    Microsoft.AspNet.WebApi.Cors安装包

  • 然后在您的WebApiConfig文件中:
        public static void Register(HttpConfiguration config)
        {
            EnableCorsAttribute cors = new 
                 EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            AddRoutes(config);
        }

您已经完成了此步骤,只需将EnableCors(cors)上方的AddRoutes(config);方法

  • 最后,您将以下属性放在SaveWithPost上方:
[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]

注意:如果仍然出现此错误:

  

选项http://localhost/Service1.svc/saveWithPost/WithParameter 405(不允许使用方法)   从源'http://localhost/Service1.svc/saveWithPost/WithParameter'处对'http://localhost'处XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。

在此处the official documentation of Microsoft阅读。该链接将带您进入Cors的工作方式,在这里您可以阅读更多有关飞行前请求的信息。不久,浏览器在实际请求之前发送了一个附加请求。 了解更多here

另一面注意事项:检查是否没有阻止OPTIONS请求。例如,一些公司使用基于网络设备和云服务的安全,网络和存储产品软件,这些软件会将所有即将到来的请求过滤到自己的服务器上,这有时可能会导致这种情况。 (不太可能)

希望这会有所帮助,

欢呼