没有 ASP.NET AJAX 的 JQuery/WCF:
Posted
技术标签:
【中文标题】没有 ASP.NET AJAX 的 JQuery/WCF:【英文标题】:JQuery/WCF without ASP.NET AJAX: 【发布时间】:2010-10-13 21:55:48 【问题描述】:当 WCF 配置良好并且 jQuery 很好地构建其请求/理解响应时,我正在努力获得那个“神奇”的时刻。
我有一个服务:
<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
这是Rick Strahl 人推荐的,以避免必须在 Web.config 中定义行为。
我的 WCF 服务接口位于另一个程序集中:
namespace xxx.yyy.WCF.Data
[ServiceContract(Namespace = "yyyWCF")]
public interface IClientBroker
[OperationContract]
[WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)]
IClient GetClientJson(int clientId);
具体的服务类是:
namespace xxx.yyy.WCF.Data
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
class ClientBroker : IClientBroker
public IClient GetClientJson(int clientId)
IClient client=new Client();
// gets and returns an IClient
return client;
我的 IClient 是一个实体框架类,因此适当地用 DataContract/DataMember 属性装饰。
我正在尝试使用 Rick Strahl 的博客http://www.west-wind.com/weblog/posts/324917.aspx(“全脂”版本)中概述的方法调用我的 WCF 服务。调试器很好地跳转到 WCF 服务(所以我的 jQuery/JSON 被理解)并获取 IClient 并返回它。但是,当我返回响应时,我会收到各种无用的错误。我回来的错误没有多大意义。
我正在使用 POST。
我使用接口而不是具体对象是否正确?由于它确实进入了 WCF 服务,它似乎确实是失败的结果的编码。
有人有什么想法吗?
【问题讨论】:
对于我的问题的编辑,我是英国人,我不会对“行为”使用美国拼写。在这种情况下,“接口”也是一个专有名词,我将使用大写的 I 来表示。 【参考方案1】:乍一看,您的代码存在三个问题:
1:您应该使用ServiceKnownTypeAttribute 在您的操作合同中仅公开基本类型时指定已知类型:
[ServiceContract(Namespace = "yyyWCF")]
public interface IClientBroker
[OperationContract]
[ServiceKnownType(typeof(Client))]
[WebInvoke(
Method="GET",
BodyStyle=WebMessageBodyStyle.WrappedRequest,
ResponseFormat=WebMessageFormat.Json)]
IClient GetClientJson(int clientId);
2:您应该使用WebMessageBodyStyle.WrappedRequest
而不是WebMessageBodyStyle.Wrapped
,因为后者与WebScriptServiceHostFactory 不兼容。
3:恕我直言,对于名为 GetClientJson 的方法,使用 Method="GET" 比 Method="POST" 更 RESTful
在使用 WCF 服务时,我可以给您的另一个建议是使用与 Visual Studio 捆绑的SvcTraceViewer.exe。它是用于调试目的的好工具。您只需将以下部分添加到您的 app/web.config:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "WcfDetailTrace.e2e" />
</listeners>
</source>
</sources>
</system.diagnostics>
然后调用 web 方法,WcfDetailTrace.e2e 文件将在您的网站根目录中生成。接下来用 SvcTraceViewer.exe 打开这个文件,你会看到很多有用的信息。例如它可以说:
无法序列化类型的参数 'MyNamespace.Client'(用于操作 'GetClientJson',合同 'IClientBroker') 因为它不是 确切类型“MyNamespace.IClient” 方法签名并且不在 已知类型集合。为了 序列化参数,添加类型 到已知类型集合 操作使用 ServiceKnownTypeAttribute。
当然你不应该忘记在投入生产之前评论这部分,否则你可能会得到一些相当大的文件。
【讨论】:
感谢 Darin,原来我的问题是 JSON 序列化实体框架对象(博客:tinyurl.com/cc4k37)。但是您关于 SvcTraceViewer 的提示对于提醒我这个很棒的工具并发现异常非常宝贵。另外:同意一些方法的REST,只是不是这个1!【参考方案2】:我 99% 确定您不能返回接口。我不认为接口是可序列化的。
看看这个thread
【讨论】:
谢谢迈克,你确实是对的。我漂亮的基于接口的 API 就这么多,嗯?!已将我的 WCF 接口降级为 JSON 字符串,将序列化引入“内部”。【参考方案3】:关于这个问题,不久前我在我的博客上发表了一篇文章,展示了让 WCF 服务与客户端的 jQuery 代码一起工作所需的所有步骤:
http://yoavniran.wordpress.com/2009/08/02/creating-a-webservice-proxy-with-jquery/
【讨论】:
以上是关于没有 ASP.NET AJAX 的 JQuery/WCF:的主要内容,如果未能解决你的问题,请参考以下文章
一起使用 ASP.Net AJAX 和 JQuery 的任何缺点
asp.net jquery ajax post 后台页面获取不到值 怎么解决?
ASP.NET 跨域请求之jQuery的ajax jsonp的使用解惑 (转载)