没有 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:的主要内容,如果未能解决你的问题,请参考以下文章

jquery ajax调用asp.net上的多个参数

一起使用 ASP.Net AJAX 和 JQuery 的任何缺点

asp.net jquery ajax post 后台页面获取不到值 怎么解决?

ASP.NET 跨域请求之jQuery的ajax jsonp的使用解惑 (转载)

添加 FriendlyUrls 时,jQuery ajax 调用不适用于 ASP.Net Web 窗体

asp.net core mvc 异步表单(Ajax.BeginForm)