Моей проблемой оказалось 2 вопроса:
- Мой сайт перенаправляет URL-адреса для всех запросов GET в нижний регистр. Запросы ODATA чувствительны к регистру. Это вызывало у меня проблемы с диагностикой проблемы, но не вызывало проблему POST. Удаление этого для моего сервиса uri помогло мне определить реальную проблему.
- Реальная проблема заключалась в том, что в моем 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();
#>
}