WCF NullReferenceException - PullRequest
       1

WCF NullReferenceException

0 голосов
/ 10 июня 2011

Я размещаю сайт ASP.NET MVC на Winhost и недавно добавил службу данных WCF для пользователей, предоставляющих отзывы.Служба работает нормально с моей локальной машины, но при ее развертывании я получаю следующее исключение System.NullReferenceException, возвращаемое в Fiddler всякий раз, когда я пытаюсь сохранить запись в службе:

<?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> 

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Моей проблемой оказалось 2 вопроса:

  1. Мой сайт перенаправляет URL-адреса для всех запросов GET в нижний регистр. Запросы ODATA чувствительны к регистру. Это вызывало у меня проблемы с диагностикой проблемы, но не вызывало проблему POST. Удаление этого для моего сервиса uri помогло мне определить реальную проблему.
  2. Реальная проблема заключалась в том, что в моем DataContext для моих объектов POCO была включена генерация прокси.

Вот более подробное описание того, как я нашел проблему, если она помогает кому-либо отладить похожую проблему:

По предложению Дэна я включил трассировку, чтобы посмотреть, смогу ли я получить какие-либо дополнительные детали. Это показало мне, что я получаю System.ServiceModel.CommunicationObjectAbortedException . Некоторое время я искал причину этого, но безуспешно.

Затем я установил свой EntitySetRights для моего DataService на EntitySetRights.All , чтобы посмотреть, смогу ли я определить ошибку, пытаясь прочитать мой набор сущностей (обратите внимание, что в моем случае это временное изменение для отладки ).

static public void InitializeService(DataServiceConfiguration config) {            
...
    config.SetEntitySetAccessRule("myentityset", EntitySetRights.All);
...
}

Затем я запросил службу http://mydomain.com/myservice.svc/myentityset и получил следующую ошибку:

Ресурс не найден для сегмента 'myentityset'

Это произошло из-за того, что мой сайт заставил все URL прописными буквами (очевидно, запросы ODATA чувствительны к регистру ). Мой набор сущностей называется что-то вроде «MyEntitySet», но он запрашивался как «myentityset». Как только я отключил это для своего URL-адреса службы, я получил ошибку, подобную следующей:

Внутренняя ошибка сервера. Тип 'System.Data.Entity.DynamicProxies.myentity_XXXX' не является сложным типом или типом сущности

Поиск этой ошибки привел меня к этой ссылке , идентифицирующей мою основную проблему. Проблема заключается в генерации сущностей POCO для DataServices. Для решения проблемы ProxyCreationEnabled должен быть установлен в false. Я добавил следующий метод в мой шаблон T4, который генерирует мой ObjectContext.

<#+

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

Затем я добавил вызов моего метода в каждый из конструкторов, аналогичный следующему:

public <#=code.Escape(container)#>()
    : base(ConnectionString, ContainerName)
{
<#
        WriteLazyLoadingEnabled(container);
        WriteProxyCreation();
#>
}
1 голос
/ 10 июня 2011

Включите трассировку как на сервере, так и на клиенте (см. http://msdn.microsoft.com/en-us/library/ms733025.aspx),, затем используйте SvcTraceViewer (http://msdn.microsoft.com/en-us/library/ms732023.aspx).. Обычно это дает более подробное исключение.

...