Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有ASP.NET AJAX的JQuery/WCF:_C#_Jquery_Wcf_Json_.net 3.5 - Fatal编程技术网

C# 没有ASP.NET AJAX的JQuery/WCF:

C# 没有ASP.NET AJAX的JQuery/WCF:,c#,jquery,wcf,json,.net-3.5,C#,Jquery,Wcf,Json,.net 3.5,当WCF被很好地配置,jQuery正在很好地构造它的请求/理解响应时,我正在努力获得那个“神奇”时刻 我有一项服务: <%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory&qu

当WCF被很好地配置,jQuery正在很好地构造它的请求/理解响应时,我正在努力获得那个“神奇”时刻

我有一项服务:

<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"  %>
具体服务类别为:

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的博客(全脂版)中概述的方法调用我的WCF服务。调试器很好地跳入WCF服务(因此可以理解我的jQuery/JSON)并获取IClient并返回它。然而,当我返回响应时,我会得到各种无用的错误。我所犯的错误并不重要

我在用邮局

我使用接口而不是具体对象对吗?当它进入WCF服务时,似乎是对失败的结果进行编码


有人有什么想法吗?

我99%确定您不能返回接口。我不认为接口是可序列化的


查看此

乍一看,您的代码有三个问题:

1:在操作合约中仅公开基类型时,应使用指定已知类型:

[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
,因为后者与不兼容

3:IMHO使用Method=“GET”对于名为GetClientJson的方法比Method=“POST”的方法更加RESTful

在使用WCF服务时,我可以给您的另一个建议是使用与VisualStudio捆绑的服务。它是用于调试目的的一个很好的工具。您只需将以下部分添加到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” 方法签名和不在 已知类型集合。为了 序列化参数,添加类型 到的已知类型集合 操作使用 服务知识致敬


当然,在投入生产之前,您不应该忘记对本节进行注释,否则您可能会得到一些相当大的文件。

与此相关,不久前我在我的博客上发表了一篇文章,介绍了让WCF服务与客户端的jQuery代码协同工作所需的所有步骤:


谢谢Darin,原来我的问题是JSON序列化实体框架对象(blogged:)。但是你关于SvcTraceViewer的提示非常宝贵,它让我想起了这个伟大的工具,也发现了异常。另外:同意REST的一些方法,只是不是这个1!谢谢你,迈克,你说得对。我的基于接口的API就这么多了,嗯?!我已经将我的WCF接口降级为JSON字符串,带来了“内部”序列化。对于我问题的编辑,我是英国人,我不会使用美国拼写来表示“行为”。此外,“接口”在该上下文中是一个专有名词,我将使用大写的I来表示它。
  <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>