我有一个asp.net asmx服务,我想将其转换为wcf服务。
我在使用带参数的jquery ajax POST请求调用wcf服务时遇到问题。
如果我在没有参数的情况下调用WCF服务或以json格式传递参数,它就可以正常工作。
当执行以下jquery帖子到wcf服务时,我得到错误500。
请注意,我无法更改jquery请求的方式。
原始ASMX服务:
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void SendStatus(string param1, string param2)
{
..................
}
jQuery POST:
var d = { param1: 1, param2: 2 };
$.ajax({
type: "POST",
url: "/Service1.asmx/SendStatus",
data: d,
success: function () { }
});
新WCF服务:
[OperationContract]
[WebInvoke]
public void SendStatus(string param1, string param2)
{
}
jQuery POST:
var d = { param1: 1, param2: 2 };
$.ajax({
type: "POST",
url: "/Service2.svc/SendStatus",
data: d,
success: function () { }
});
答案 0 :(得分:2)
- 编辑 - 我记得这个问题曾让我疯了一次,所以我又回去看了一眼。果然......鉴于要求Javscript保持书面形式,我坚持认为,对于当前版本的WCF来说,这实际上是不可能的。请考虑以下几点:
1)您需要使用webHttpBinding,因为这是唯一支持REST样式服务的绑定(basicHttpBinding和WSHttpBinding都使用SOAP包装器)。 (参见此处:BasicHttpBinding vs WsHttpBinding vs WebHttpBinding)
2)此问题中编写的AJAX调用使用内容类型“application / x-www-form-urlencoded”(您可以使用Fiddler确认)。
3)您还可以确认WCF在调用服务方法之前抛出异常。例外情况如下:
'WebScriptEnablingBehavior'不支持正文样式'Bare'。将正文样式更改为“WrappedRequest”。
但是“裸”的主体样式是Microsoft代表使用基本参数的REST请求(即,不是用JSON或XML“包装”)。也就是说,没有可能的配置允许WCF处理这个特定的AJAX请求。您甚至可以实现自己的WebContentTypeMapper,它仍然无法正常工作。这家伙对他们说:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2473190-consider-making-the-system-servicemodel-channels-r
我的结论是(假设你不能使用MVC,这会让这件事变得轻而易举),你需要以某种方式将这个请求路由到一个基本的.ASPX页面,并使用可靠的旧Webforms方法(Page。 IsPostBack,Request.Params [“param1”]等。
- 结束编辑 -
根据上面的另一个帖子,看起来你需要在AJAX调用中添加/修复一些参数:
...
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(d)
...
答案 1 :(得分:1)
如果无法更改客户端代码,则不将这些端点从ASMX迁移到WCF。 WCF使用与ASMX不同,灵活性较低的序列化程序,您可能会遇到麻烦,只能通过更改客户端数据的发送,接收和/或处理方式来解决。
如果您愿意处理这种混乱,那么更好的迁移路径将等待ASP.NET Web API发布并转移到它。如果您现在转移到WCF,那么今年晚些时候Web API将会再次落后。
答案 2 :(得分:0)
我认为你必须用双引号(“”)传递字符串参数值。像这样:
var d = { param1: "1", param2: "2" };
$.ajax({
type: "POST",
url: "/Service2.svc/SendStatus",
data: d,
success: function () { }
});
希望这会奏效。
500错误代码表示参数值与所需值不匹配。