没有ASP.NET AJAX的JQuery / WCF:
当WCF配置得很好并且jQuery很好地构建其请求/理解响应时,我正在努力获得“神奇”的时刻。
我有服务:
这是由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是一个entity framework类,因此适当地使用DataContract / DataMember属性进行修饰。
我正在尝试使用Rick Strahl博客上列出的方法调用我的WCF服务, url为http://www.west-wind.com/weblog/posts/324917.aspx (“全脂”版本)。 调试器很好地跳转到WCF服务(因此我的jQuery / JSON被理解)并获取IClient并返回它。 但是,当我返回响应时,我会收到各种无用的错误。 我得到的错误并不重要。
我正在使用POST。
我是否正确使用接口而不是具体对象? 因为它确实进入了WCF服务,它似乎是失败的结果的编码。
有没有人有任何想法?
乍一看,您的代码有三个问题:
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:使用Method =“GET”的IMHO对于一个名为GetClientJson的方法比Method =“POST”更加RESTful
使用WCF服务时,我可以给你的另一个建议是使用与Visual Studio捆绑在一起的SvcTraceViewer.exe 。 它是一个很好的调试工具。 您只需将以下部分添加到app / web.config:
然后调用Web方法,将在您的网站根目录中生成WcfDetailTrace.e2e文件。 接下来使用SvcTraceViewer.exe打开此文件,您将看到许多有用的信息。 例如它可以说:
无法序列化’MyNamespace.Client’类型的参数(对于操作’GetClientJson’,收缩’IClientBroker’),因为它不是方法签名中的确切类型’MyNamespace.IClient’,并且不在已知类型集合中。 要序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合中。
当然,在开始制作之前你不应该忘记评论这一部分,否则你可能会得到一些相当大的文件。
我99%肯定你不能返回一个界面。 我不认为接口是可序列化的。
看看这个post
与此问题相关,不久前我在我的博客上发布了一篇文章,显示了在客户端使WCF服务与jQuery代码一起工作所需的所有步骤:
http://yoavniran.wordpress.com/2009/08/02/creating-a-webservice-proxy-with-jquery/