首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF NullReferenceException

WCF NullReferenceException
EN

Stack Overflow用户
提问于 2011-06-10 20:19:58
回答 2查看 665关注 0票数 0

我在Winhost上托管了一个WCF站点,最近还为提供反馈的用户添加了ASP.NET数据服务。该服务在我的本地机器上运行良好,但当我部署它时,每当我尝试保存服务的条目时,都会在Fiddler中返回以下System.NullReferenceException:

代码语言:javascript
复制
<?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)&#xD;
   at System.Data.Services.Serializers.Deserializer.SetPropertyValue(ResourceProperty resourceProperty, Object declaringResource, Object propertyValue, ContentFormat contentFormat, IDataService service)&#xD;
   at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyProperty(XmlReader reader, String propertyName, ResourceType resourceType, Object resource)&#xD;
   at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyContent(XmlReader reader, ResourceType resourceType, Object resource)&#xD;
   at System.Data.Services.Serializers.PlainXmlDeserializer.ApplyContent(Deserializer deserializer, XmlReader reader, ResourceType resourceType, Object resource, EpmAppliedPropertyInfo propertiesApplied, Int32 currentObjectCount)&#xD;
   at System.Data.Services.Serializers.SyndicationDeserializer.ApplyProperties(SyndicationItem item, ResourceType resourceType, EpmAppliedPropertyInfo propertiesApplied, Object resource)&#xD;
   at System.Data.Services.Serializers.SyndicationDeserializer.CreateObject(SegmentInfo segmentInfo, Boolean topLevel, SyndicationItem item)&#xD;
   at System.Data.Services.Serializers.SyndicationDeserializer.CreateSingleObject(SegmentInfo segmentInfo)&#xD;
   at System.Data.Services.Serializers.Deserializer.ReadEntity(RequestDescription requestDescription)&#xD;
   at System.Data.Services.Serializers.Deserializer.HandlePostRequest(RequestDescription requestDescription)&#xD;
   at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)&#xD;
   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;
   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;
   at System.Data.Services.DataService`1.HandleRequest()</stacktrace>
  </innererror>
</error> 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-12 09:17:34

我的问题变成了两个问题:

  1. My site将所有GET请求的Url重新路由为小写。ODATA查询区分大小写。这给我诊断问题带来了麻烦,但不是POST问题。为我的服务uri删除这个帮助我找出了真正的问题。
  2. 真正的问题是我的POCO实体的DataContext启用了代理生成。

下面是我如何发现这个问题的更长的描述,以防它帮助任何人调试类似的问题:

根据Dan的建议,我启用了跟踪,以查看是否可以获得任何其他详细信息。这向我表明我得到了一个System.ServiceModel.CommunicationObjectAbortedException.我找了一段时间也没有找到原因。

接下来,我将DataService的EntitySetRights设置为EntitySetRights.All,以查看是否可以通过尝试读取实体集来确定错误(请注意,在我的示例中,这是一个临时的调试更改)。

代码语言:javascript
复制
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模板中。

代码语言:javascript
复制
<#+

private void WriteProxyCreation()
{
#>
    this.ContextOptions.ProxyCreationEnabled = false;
<#+
}
#>

然后,我在每个构造函数中添加了对我的方法的调用,如下所示:

代码语言:javascript
复制
public <#=code.Escape(container)#>()
    : base(ConnectionString, ContainerName)
{
<#
        WriteLazyLoadingEnabled(container);
        WriteProxyCreation();
#>
}
票数 1
EN

Stack Overflow用户

发布于 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)。它通常会给你一个更详细的异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6306259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档