返回城堡DynamicProxy對象時,我有一些問題調用signalr集線器時,返回的對象是一個Castle DynamicProxy。SignalR樞紐調用不起作用沒有默認構造
比方說,我對signalr樞紐以下服務器的代碼(這不是真正的代碼,但只是爲了說明問題):
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序列化的問題?
SignalR使用JSON.NET所以如果JSON.NET無法反序列化對象出於某種原因(以上除外),它不會在SignalR工作,要麼。 – davidfowl
@dfowler謝謝大衛。唯一奇怪的想法是我從SignalR沒有收到任何錯誤。最終可以使用自定義序列化?或者直接返回一個json? –
我們不會在這裏給出很好的錯誤,因爲我們以塊的形式編寫響應。我們將考慮報告這個錯誤是未來更好的方法。 你當然可以序列化你自己併發送字符串(儘管你會雙重序列化)。 JSON.NET也具有串行器可插入性 – davidfowl