繁体   English   中英

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

[英]Migrating ASMX Service to WCF Service - AJAX Post

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

- 编辑 - 我记得这个问题曾让我疯了一次,所以我又回去看了一眼。 果然......鉴于要求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”。

但是“裸”的主体风格是微软代表使用基本参数的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)
...

如果无法更改客户端代码, 则不应将这些端点从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错误代码表示参数值与所需值不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM