我在使用jQuery AJAX从“支持AJAX的WCF服务”中的WebGet函数检索数据时遇到问题。服务代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
namespace SPA
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class db
{
// To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
// To create an operation that returns XML,
// add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
// and include the following line in the operation body:
// WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
[WebGet]
[OperationContract]
public IEnumerable<Geofence> GetGeofences()
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
var dc = new AtomnetDataContext();
return dc.Geofences;
}
// Add more operations here and mark them with [OperationContract]
}
}
这是试图调用它的代码:
$(function () {
$.get("db.svc/GetGeofences", alert);
});
在服务方法代码中放置一个断点,表明它确实被调用了。我确认通过将dc.Geofences.ToArray()实现为变量(未在示例中显示)来成功获取数据。 Geofence
是Linq2sql生成的类型。
将调用转换为显式的ajax调用$.ajax({ ... });
会将错误对象返回给错误函数,但其中包含的消息只是说“错误”,这不是指导性的。
使用等同于Firebug的IE10检查网络流量,显示呼叫为“(已中止)”。此问题已成为服务配置,因为调用会尝试返回值。
似乎存在序列化异常,然后是通信异常,这可能是相应的。
A first chance exception of type 'System.Runtime.Serialization.SerializationException'
occurred in System.Runtime.Serialization.dll A first chance exception of type
'System.ServiceModel.CommunicationException' occurred in System.ServiceModel.Web.dll
答案 0 :(得分:0)
所有问题的根源在于,在将名称错误的实体SiteData添加到模型后,我将其重命名为Geofences。如果你这样做,你就会遇到我描述的问题。如果你不这样做,那么一切都很糟糕。
我仍然面临的另一个问题是,当我包含与设计人员识别和实现的SiteData关系的其他实体时,这也会产生序列化错误。手动删除关系会将其分类,但我有最强烈的感觉,您可以通过配置设置修复此问题。谁知道怎么做?
哦,你不能传递alert
作为成功函数,传递这样的本机函数似乎解散了jquery。 O'reilly jQuery Pocket Reference的p70上的示例不起作用。无论如何,不是IE10。
序列化错误是循环的结果。更多的挖掘产生了这个信息:
System.Runtime.Serialization.SerializationException occurred
HResult=-2146233076
Message=Object graph for type 'SPA.SiteGroup' contains cycles and cannot be
serialized if reference tracking is disabled.
Source=System.Runtime.Serialization
StackTrace:
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.OnHandleReference(XmlWriterDelegator xmlWriter, Object obj, Boolean canContainCyclicReference)
InnerException:
现在的问题是如何启用参考跟踪。
这应该是端点行为的一个属性。
<behaviors>
<endpointBehaviors>
<behavior name="SPA.dbAspNetAjaxBehavior">
<enableWebScript />
<dataContractSerializer
preserveObjectReferences="true"
ignoreExtensionDataObject="false"
maxItemsInObjectGraph="99" />
</behavior>
</endpointBehaviors>
</behaviors>
不幸的是,您无法做任何合理的事情,因为System.ServiceModel.Configuration.DataContractSerializerElement不会公开DataContractSerializer的preserveObjectReferences构造函数参数。
我的阴谋理论家怀疑这不是偶然的。实体框架团队不喜欢Linq2Sql,因为它通过一个国家英里执行EF来使他们感到尴尬。
我找到了另一种解决方法:如果您不想删除关联,可以选择它们并将Child Property
属性设置为False。这会禁止生成子对象集合,然后您没有循环引用。