我在Winhost上托管了一个WCF站点,最近还为提供反馈的用户添加了ASP.NET数据服务。该服务在我的本地机器上运行良好,但当我部署它时,每当我尝试保存服务的条目时,都会在Fiddler中返回以下System.NullReferenceException:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code></code>
<message xml:lang="en-US">An error occurred while processing this request.</message>
<innererror>
<message>Object reference not set to an instance of an object.</message>
<type>System.NullReferenceException</type>
<stacktrace> at System.Data.Services.Providers.ObjectContextServiceProvider.SetValue(Object targetResource, String propertyName, Object propertyValue)
at System.Data.Services.Serializers.Deserializer.SetPropertyValue(ResourceProperty resourceProperty, Object declaringResource, Object propertyValue, ContentFormat contentFormat, IDataService service)
at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyProperty(XmlReader reader, String propertyName, ResourceType resourceType, Object resource)
at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyContent(XmlReader reader, ResourceType resourceType, Object resource)
at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyContent(Deserializer deserializer, XmlReader reader, ResourceType resourceType, Object resource, EpmAppliedPropertyInfo propertiesApplied, Int32 currentObjectCount)
at System.Data.Services.Serializers.SyndicationDeserializer.ApplyProperties(SyndicationItem item, ResourceType resourceType, EpmAppliedPropertyInfo propertiesApplied, Object resource)
at System.Data.Services.Serializers.SyndicationDeserializer.CreateObject(SegmentInfo segmentInfo, Boolean topLevel, SyndicationItem item)
at System.Data.Services.Serializers.SyndicationDeserializer.CreateSingleObject(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.Deserializer.ReadEntity(RequestDescription requestDescription)
at System.Data.Services.Serializers.Deserializer.HandlePostRequest(RequestDescription requestDescription)
at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
at System.Data.Services.DataService`1.HandleRequest()</stacktrace>
</innererror>
</error> 发布于 2011-06-12 09:17:34
我的问题变成了两个问题:
下面是我如何发现这个问题的更长的描述,以防它帮助任何人调试类似的问题:
根据Dan的建议,我启用了跟踪,以查看是否可以获得任何其他详细信息。这向我表明我得到了一个System.ServiceModel.CommunicationObjectAbortedException.我找了一段时间也没有找到原因。
接下来,我将DataService的EntitySetRights设置为EntitySetRights.All,以查看是否可以通过尝试读取实体集来确定错误(请注意,在我的示例中,这是一个临时的调试更改)。
static public void InitializeService(DataServiceConfiguration config) {
...
config.SetEntitySetAccessRule("myentityset", EntitySetRights.All);
...
}然后,我查询了服务http://mydomain.com/myservice.svc/myentityset,收到以下错误:
找不到段'myentityset‘的
资源
这被证明是因为我的网站强制所有的urls都是小写的(显然是ODATA queries are case sensitive)。我的实体集被命名为类似于'MyEntitySet‘的名称,但它被查询为'myentityset’一旦我对我的服务url禁用了它,我收到了一个类似以下的错误:
内部服务器错误。类型'System.Data.Entity.DynamicProxies.myentity_XXXX‘不是复杂类型或实体类型
通过查找这个错误,我找到了this link,找出了我的核心问题。问题出在DataServices的POCO实体生成上。为了解决这个问题,需要将ProxyCreationEnabled设置为false。我将以下方法添加到生成ObjectContext的T4模板中。
<#+
private void WriteProxyCreation()
{
#>
this.ContextOptions.ProxyCreationEnabled = false;
<#+
}
#>然后,我在每个构造函数中添加了对我的方法的调用,如下所示:
public <#=code.Escape(container)#>()
: base(ConnectionString, ContainerName)
{
<#
WriteLazyLoadingEnabled(container);
WriteProxyCreation();
#>
}发布于 2011-06-10 22:14:24
在服务器和客户端上打开跟踪(请参见http://msdn.microsoft.com/en-us/library/ms733025.aspx),然后使用SvcTraceViewer (http://msdn.microsoft.com/en-us/library/ms732023.aspx)。它通常会给你一个更详细的异常。
https://stackoverflow.com/questions/6306259
复制相似问题