将ASMX服务迁移到WCF服务 - AJAX Post

时间:2012-04-01 20:23:01

标签: c# asp.net .net wcf web-services

我有一个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 () { }
        });

3 个答案:

答案 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错误代码表示参数值与所需值不匹配。