我有一个 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 发布:
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 发布:
var d = { param1: 1, param2: 2 };
$.ajax({
type: "POST",
url: "/Service2.svc/SendStatus",
data: d,
success: function () { }
});
最佳答案
-- 编辑-- 我记得这个问题曾经让我抓狂过一次,所以我回去再看一眼。果然……考虑到 Javscript 保持原样的要求,我坚持认为这对于当前版本的 WCF 实际上是不可能的。请考虑以下几点:
1) 您需要使用 webHttpBinding,因为这是唯一支持 REST 样式服务的绑定(bind)(basicHttpBinding 和 WSHttpBinding 都使用 SOAP 包装器)。 (此处引用:BasicHttpBinding vs WsHttpBinding vs WebHttpBinding)
2) 此问题中所写的 AJAX 调用使用内容类型“application/x-www-form-urlencoded”(您可以使用 Fiddler 确认这一点)。
3) 您还可以确认 WCF 在调用服务方法之前抛出异常。异常情况如下:
The body style 'Bare' is not supported by 'WebScriptEnablingBehavior'. Change the body style to be '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)
...
关于c# - 将 ASMX 服务迁移到 WCF 服务 - AJAX 帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9967991/