У меня возникают проблемы с вызовом концентратора сигналов, когда возвращаемый объект является Castle DynamicProxy.
Допустим, у меня есть следующий код сервера на концентраторе сигналов (это не настоящий код, а просто для демонстрации проблемы):
public Article Read()
{
var article = new Article(0);
return article;
}
public class Article
{
public Article(int id)
{
Id = id;
}
public int Id { get; set; }
}
Вышеупомянутый метод правильно возвращает мой объект. Если я изменю этот код на:
public Article Read()
{
var proxyGenerator = new Castle.DynamicProxy.ProxyGenerator();
var entity = proxyGenerator.CreateClassProxy(typeof(Article), new object[]{0}, new TestInterceptor()) as Article; ;
return entity;
}
class TestInterceptor : Castle.DynamicProxy.IInterceptor
{
public void Intercept(Castle.DynamicProxy.IInvocation invocation)
{
}
}
Объект никогда не возвращается. Клиент (javascript) не получает никаких ошибок, и ни функции done
, ни fail
не выполняются.
Я подозреваю, что это проблема с сериализацией. Если я попытаюсь сериализовать объект с помощью Newtonsoft, я получу следующую ошибку:
System.ArgumentNullException was unhandled by user code
HResult=-2147467261
Message=Value cannot be null.
Parameter name: key
Source=mscorlib
ParamName=key
StackTrace:
at System.Collections.ObjectModel.KeyedCollection`2.Contains(TKey key)
at Newtonsoft.Json.Serialization.JsonPropertyCollection.AddProperty(JsonProperty property)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateConstructorParameters(ConstructorInfo constructor, JsonPropertyCollection memberProperties)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType)
at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.GetContractSafe(Object value)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Type type, Formatting formatting, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Formatting formatting, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value)
InnerException:
Есть идеи? Это проблема сериализации signalr?
РЕДАКТИРОВАТЬ:
Благодаря Андерсу я обнаружил, что проблема возникает только тогда, когда класс, для которого вы создали динамический прокси, не имеет конструктора по умолчанию. Например public Article(int id)
. Это проблема с сериализацией Json.NET?