gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:06:57 28 4
gpt4 key购买 nike

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

我有一个服务:

<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"  %>

这是男人推荐的Rick Strahl以避免必须在 Web.config 中定义行为。

我的 WCF 服务接口(interface)位于另一个程序集中:

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 的博客 http://www.west-wind.com/weblog/posts/324917.aspx 中概述的方法调用我的 WCF 服务(“全脂”版本)。调试器可以很好地跳入 WCF 服务(因此可以理解我的 jQuery/JSON)并获取 IClient 并返回它。但是,当我返回响应时,出现了各种无用的错误。我得到的错误没有多大意义。

我正在使用 POST。

我使用接口(interface)而不是具体对象是否正确?当它确实进入 WCF 服务时,它似乎确实是失败的结果编码。

有没有人有什么想法?

最佳答案

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

1:你应该使用ServiceKnownTypeAttribute在您的操作契约(Contract)中仅公开基本类型时指定已知类型:

[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"对于名为 GetClientJson 的方法比 Method="POST"更符合 RESTful

在使用 WCF 服务时我可以给你的另一个建议是使用 SvcTraceViewer.exe与 Visual Studio 捆绑在一起。它是用于调试目的的好工具。您只需将以下部分添加到您的 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 打开这个文件,你会看到很多有用的信息。例如它可以说:

Cannot serialize parameter of type 'MyNamespace.Client' (for operation 'GetClientJson', contract 'IClientBroker') because it is not the exact type 'MyNamespace.IClient' in the method signature and is not in the known types collection. In order to serialize the parameter, add the type to the known types collection for the operation using ServiceKnownTypeAttribute.

当然,在投入生产之前,您不应该忘记对这部分进行评论,否则您可能会得到一些非常大的文件。

关于c# - 没有 ASP.NET AJAX 的 JQuery/WCF :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com