我正在尝试使用另一个项目的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正常状态。
答案 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中所做的(根据您的标签来判断):
Microsoft.AspNet.WebApi.Cors安装包
public static void Register(HttpConfiguration config)
{
EnableCorsAttribute cors = new
EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
AddRoutes(config);
}
您已经完成了此步骤,只需将EnableCors(cors)
上方的AddRoutes(config);
方法
[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请求。例如,一些公司使用基于网络设备和云服务的安全,网络和存储产品软件,这些软件会将所有即将到来的请求过滤到自己的服务器上,这有时可能会导致这种情况。 (不太可能)
希望这会有所帮助,
欢呼