C# 信号集线器调用不';返回没有默认构造函数的Castle DynamicProxy对象时不起作用

C# 信号集线器调用不';返回没有默认构造函数的Castle DynamicProxy对象时不起作用,c#,json.net,signalr,castle-dynamicproxy,C#,Json.net,Signalr,Castle Dynamicproxy,当返回的对象是信号器时,调用信号器集线器会遇到一些问题 假设我在信号集线器上有以下服务器代码(这不是真正的代码,只是为了说明问题): 上面的方法正确地返回我的对象。如果我将此代码更改为: public Article Read() { var proxyGenerator = new Castle.DynamicProxy.ProxyGenerator(); var entity = proxyGenerator.CreateClassProxy(typeof(Article),

当返回的对象是信号器时,调用信号器集线器会遇到一些问题

假设我在信号集线器上有以下服务器代码(这不是真正的代码,只是为了说明问题):

上面的方法正确地返回我的对象。如果我将此代码更改为:

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: 
有什么想法吗?这是信号机的串行化问题

编辑:


多亏了Anders,我发现只有当为其创建动态代理的类没有默认构造函数时,才会出现问题。例如
公共文章(int-id)
。Json.NET序列化有问题吗?

Json.NET序列化动态代理没有问题,这对我来说很有效

class Program
{
    static void Main(string[] args)
    {
        var proxyGenerator = new Castle.DynamicProxy.ProxyGenerator();
        var entity = proxyGenerator.CreateClassProxy(typeof(Article), new object[0], new TestInterceptor()) as Article; ;
        var json = JsonConvert.SerializeObject(entity);
    }
}

public class Article
{
    public int Id { get; set; }
}

class TestInterceptor : Castle.DynamicProxy.IInterceptor
{
    public void Intercept(Castle.DynamicProxy.IInvocation invocation)
    {
    }
}   
结果是

{"__interceptors":[{}],"Id":0}
更新:

没有无参数构造函数,我在Castle中得到了一个准备就绪的期望值

Can not instantiate proxy of class: ConsoleApplication1.Article.

Could not find a parameterless constructor.

经过进一步调查,我发现了这个问题。这是Json.NET上的一个小错误。我已经在json.net上创建了一个网站,现在已经解决了。

Signal使用json.net,因此如果json.net由于某种原因(上述异常)无法反序列化该对象,它也无法在Signal中工作。@dfowler感谢David。唯一奇怪的是我没有收到信号员的任何错误。最终是否可以使用自定义序列化?或者直接返回一个json?我们在这里没有给出很好的错误,因为我们是以块的形式编写响应的。我们将研究报告此错误是未来更好的方法。当然,您可以自己序列化并发送字符串(尽管您需要双重序列化)。JSON.NET还提供了序列化程序插件。很抱歉,您是对的。事实上,我的产品代码略有不同。当类没有默认构造函数时,使用动态代理似乎是一个问题。基本上,如果Article类只有一个带参数的构造函数,比如
publicArticle(intid)
exception ArgumentNullException被抛出。你认为这是Json.NET的错误吗?考虑到如果我在没有动态代理的情况下序列化同一个类,它就工作得很好。你必须将构造函数参数传递给代理生成器:<代码> PROXEngult。CreateClassProxy(Type(To),新对象[{PARAM1},NeXestTestCurror()))作为文章;code>通过这种方式Castle正确地生成了代理,但是Json.NET在序列化时抛出了一个异常。经过进一步的调查,我发现了这个问题。这是Json.NET上的一个小错误。我在json.net上创建了一个网站,现在已经解决了这个问题。
Can not instantiate proxy of class: ConsoleApplication1.Article.

Could not find a parameterless constructor.