正在将ASMX服务迁移到WCF服务-AJAX Post
本文关键字:服务 WCF -AJAX Post 迁移 ASMX | 更新日期: 2023-09-27 18:29:51
我有一个asp.net asmx服务,我想把它转换成wcf服务。
我在使用参数从jquery ajax POST请求调用wcf服务时遇到问题。
如果我在没有参数的情况下调用WCF服务,或者以json格式传递参数,它就可以正常工作
当执行下面的jquery post到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 () { }
});
--编辑--我记得以前有一次这个问题让我抓狂,所以我又回去看了一眼。果不其然。。。考虑到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"。
但"裸"体风格是微软使用基本参数(即,不"包装"在JSON或XML中)来表示REST请求。也就是说,没有可能的配置允许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)
...
如果不能更改客户端代码,则应不要将这些端点从ASMX迁移到WCF。WCF使用了与ASMX不同的、灵活性较低的序列化程序,很可能会遇到只有通过更改客户端上发送、接收和/或处理数据的方式才能解决的问题。
如果你愿意应对这种混乱,那么更好的迁移路径应该是等到ASP.NET Web API发布并转移到它。如果你现在转移到WCF,那么今年晚些时候Web API发布时,你将再次落后。
我认为您必须用双引号(")传递字符串参数值。像这样:
var d = { param1: "1", param2: "2" };
$.ajax({
type: "POST",
url: "/Service2.svc/SendStatus",
data: d,
success: function () { }
});
希望这能奏效。
500错误代码表示参数值与所需值不匹配。