C# 没有ASP.NET AJAX的JQuery/WCF:
当WCF被很好地配置,jQuery正在很好地构造它的请求/理解响应时,我正在努力获得那个“神奇”时刻 我有一项服务: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
<%@ 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>