Ajax POST 到 WCF Rest CORS-compliant WebService 抛出错误 405
Ajax POST to WCF Rest CORS-compliant WebService throws error 405
我正在对 WCF REST WebServices 进行一些测试,但我被 POST 调用困住了。
我创建了一个 web 服务,它公开了一些关于好的 ol' Northwind DB 的测试数据,并且因为我希望从测试 HTML 页面在本地使用它,并且因为我想测试 CORS 功能,所以我将它设为 CORS遵守这些说明 http://enable-cors.org/server_wcf.html。
不幸的是,当我拨打 POST 电话时出现了问题。
与 GET 调用(效果很好)不同,POST 调用会抛出此错误:
这是什么鬼?似乎 "Access-Control-Allow-Origin" header 未正确管理 client-side,因为在我的 EnableCrossOriginResourceSharingBehavior WCF class 中,方法 "ApplyDispatchBehavior"(它过滤 "Access-Control-Allow-Origin" headers of the arrival requests) is hit when I make a POST call, but then Ajax call fails.
这是我的jQueryAjaxpost命令:
//Create new object
var item = {
"CustomerId": "0",
"CompanyName": "prova"
};
//Push object
$.ajax({
type: "POST",
url: 'http://localhost:3434/NorthwindService.svc/Customer/Create',
crossDomain: true,
headers: {'Access-Control-Allow-Origin' : '*'},
data: JSON.stringify(item),
success: function (data) {
alert('ok!');
},
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
This 是我的 WCF 服务 Visual Studio 2013 项目。
要测试它,您只需将 web.config 中的 "NorthwindConnectionString" 设置为现有的。我遇到问题的网络服务方法是 POST 到“http://localhost:3434/NorthwindService.svc/Customer/Create”方法,所有其他方法都可以正常工作。
这是我的方法契约的预览:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "Customer/Create", BodyStyle=WebMessageBodyStyle.WrappedRequest)]
void NewCustomer(CustomerDTO customer);
提前致谢。
您的 HTTP 请求方法定义为 OPTIONS
而不是 POST
。
这就是您收到 HTTP 响应 405 方法不允许(没有选项请求的处理程序)的原因
将 jQuery ajax 构造函数中的类型参数更改为 "POST"
并将请求路由到正确的处理程序。
我不知道发生了什么,但多亏了 supertopi 和他的 link,我采取了正确的步骤使其工作。不幸的是,实施此处 How to handle Ajax JQUERY POST request with WCF self-host 中讨论的所有内容均无效。即使创建了一个新项目,我仍然继续得到“405 方法不允许”。
唯一适用于我的情况是:
1) 实施 CustomHeaderMessageInspector 和 EnableCrossOriginResourceSharingBehavior 类 并编辑 web.config,如 http://enable-cors.org/server_wcf.html.
中公开的那样
2) 在服务合同中创建以下方法:
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();
3) 实现为空。
public void GetOptions()
{
}
听起来很疯狂,但确实有效。
如果我删除 GetOptions() 操作合同,我的客户端会继续出现 405 错误。如果我像 supertopi 的 link 所指示的那样实现它(显然在删除步骤 1 中创建的所有内容之后),它也不起作用。
希望对您有所帮助。
我正在对 WCF REST WebServices 进行一些测试,但我被 POST 调用困住了。 我创建了一个 web 服务,它公开了一些关于好的 ol' Northwind DB 的测试数据,并且因为我希望从测试 HTML 页面在本地使用它,并且因为我想测试 CORS 功能,所以我将它设为 CORS遵守这些说明 http://enable-cors.org/server_wcf.html。
不幸的是,当我拨打 POST 电话时出现了问题。 与 GET 调用(效果很好)不同,POST 调用会抛出此错误:
这是什么鬼?似乎 "Access-Control-Allow-Origin" header 未正确管理 client-side,因为在我的 EnableCrossOriginResourceSharingBehavior WCF class 中,方法 "ApplyDispatchBehavior"(它过滤 "Access-Control-Allow-Origin" headers of the arrival requests) is hit when I make a POST call, but then Ajax call fails.
这是我的jQueryAjaxpost命令:
//Create new object
var item = {
"CustomerId": "0",
"CompanyName": "prova"
};
//Push object
$.ajax({
type: "POST",
url: 'http://localhost:3434/NorthwindService.svc/Customer/Create',
crossDomain: true,
headers: {'Access-Control-Allow-Origin' : '*'},
data: JSON.stringify(item),
success: function (data) {
alert('ok!');
},
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
This 是我的 WCF 服务 Visual Studio 2013 项目。 要测试它,您只需将 web.config 中的 "NorthwindConnectionString" 设置为现有的。我遇到问题的网络服务方法是 POST 到“http://localhost:3434/NorthwindService.svc/Customer/Create”方法,所有其他方法都可以正常工作。 这是我的方法契约的预览:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "Customer/Create", BodyStyle=WebMessageBodyStyle.WrappedRequest)]
void NewCustomer(CustomerDTO customer);
提前致谢。
您的 HTTP 请求方法定义为 OPTIONS
而不是 POST
。
这就是您收到 HTTP 响应 405 方法不允许(没有选项请求的处理程序)的原因
将 jQuery ajax 构造函数中的类型参数更改为 "POST"
并将请求路由到正确的处理程序。
我不知道发生了什么,但多亏了 supertopi 和他的 link,我采取了正确的步骤使其工作。不幸的是,实施此处 How to handle Ajax JQUERY POST request with WCF self-host 中讨论的所有内容均无效。即使创建了一个新项目,我仍然继续得到“405 方法不允许”。 唯一适用于我的情况是:
1) 实施 CustomHeaderMessageInspector 和 EnableCrossOriginResourceSharingBehavior 类 并编辑 web.config,如 http://enable-cors.org/server_wcf.html.
中公开的那样2) 在服务合同中创建以下方法:
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();
3) 实现为空。
public void GetOptions()
{
}
听起来很疯狂,但确实有效。 如果我删除 GetOptions() 操作合同,我的客户端会继续出现 405 错误。如果我像 supertopi 的 link 所指示的那样实现它(显然在删除步骤 1 中创建的所有内容之后),它也不起作用。
希望对您有所帮助。