2012-04-01 109 views
4

我有一个asp.net asmx服务,我想将其转换为wcf服务。将ASMX服务迁移到WCF服务 - AJAX Post

我有问题从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

我的编辑点评 - 我建议使用MVC3,这使得配置请求路由比WCF更容易。我一直对WCF的灵活性感到不知所措,而且它的配置不直观(尽管我猜这对更高级的网络设置会有好处)。 – McGarnagle 2012-04-01 22:03:05

+0

MVC很好,但我已经有一个在Web窗体中的现有项目。 – RuSh 2012-04-01 22:25:24

回答

2

- 编辑 - 我记得这个问题让我疯了一次,所以我回去再看一次。果然......鉴于Javscript保持为书面的要求,我认为这在目前的WCF版本中是不可能的。考虑以下几点:

1)您需要使用webHttpBinding,因为这是支持REST样式服务的唯一绑定(basicHttpBinding和WSHttpBinding都使用SOAP包装)。 (参考这里:BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

2)写在这个问题的AJAX调用使用的内容类型的 “应用程序/ x-WWW的形式,进行了urlencoded”(你能证实这一使用招)。

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) 
... 
+0

我不想将参数更改为json。我需要离开ajax代码原样并更改wcf服务以匹配ajax。 – RuSh 2012-04-01 21:15:51

+0

@sharru gotcha。我可以建议编辑你的问题来强调这一点吗?如果您没有得到满意的答案,我会尝试使用WebForvoke的属性,例如RequestFormat:http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute_properties.aspx。 – McGarnagle 2012-04-01 21:58:33

+0

1.感谢您的意见。我确实强调它,它在黑体:) 2.我没有与WebInvoke实验,找不到有效的工作.. – RuSh 2012-04-01 22:24:12

0

我认为你必须用双引号(“”)传递字符串参数值。像这样:

var d = { param1: "1", param2: "2" }; 
    $.ajax({ 
       type: "POST", 
       url: "/Service2.svc/SendStatus", 
       data: d, 
       success: function() { } 
      }); 

希望这会起作用。

500错误代码表示参数值与所需值不匹配。

1

如果您无法更改客户端代码,则应将而不是将这些端点从ASMX迁移到WCF。 WCF使用与ASMX不同的,灵活性较低的序列化程序,很可能会遇到麻烦,只能通过更改在客户端上发送,接收和/或处理数据的方式来解决问题。

如果你愿意处理这种动荡,那么一个更好的迁移路径将等待ASP.NET Web API发货并转移到它。如果你现在转向WCF,那么今年晚些时候你将会在Web API发布后再次落后于WCF。