2

我一直在跨平台原型上测试 Glimpse,该原型将 MVVM 用于各种前端(MVC3、WPF4、WP7),并且由于 Json.NET 序列化问题,似乎在 MVC3 中遇到了 Glimpse 问题。对于不使用 MVVM 的视图,Glimpse 可以正常工作。

使用 MVVMLight v3.0.3、Autofac for DI v2.5.2 和 Glimpse v0.86。

这是一瞥日志:

2011-12-14 11:23:39.9096|INFO|Glimpse.Core.Module|针对 requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)| 的 BeginRequest 处理完成
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|get_Binders System.Web.Mvc.ControllerActionInvoker 类型的方法不可代理。|
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|System.Web.Mvc.ControllerActionInvoker 类型的 set_Binders 方法不可代理。|
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|System.Web.Mvc.ControllerActionInvoker 类型的 GetType 方法不可代理。|
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|MemberwiseClone System.Web.Mvc.ControllerActionInvoker 类型的方法不可代理。|
2011-12-14 11:23:39.9356|INFO|Glimpse.Core.Module|PostRequestHandlerExecute 处理完成 requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)|
2011-12-14 11:23:39.9356|INFO|Glimpse.Core.Module|PostReleaseRequestState 处理完成 requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)|
2011-12-14 11:23:39.9576|WARN|Glimpse.Core.Plumbing.GlimpseSerializer|Serializer 错误|System.NotSupportedException--'CommandConverter' 无法将 'GalaSoft.MvvmLight.Command.RelayCommand' 转换为 'System.String '.-- 在 System.ComponentModel.TypeConverter.GetConvertToException(对象值,类型 destinationType)
   在 System.Windows.Input.CommandConverter.ConvertTo(ITypeDescriptorContext 上下文,CultureInfo 文化,对象值,类型 destinationType)
   在 System.ComponentModel.TypeConverter.ConvertToString(ITypeDescriptorContext 上下文,CultureInfo 文化,对象值)
   在 System.ComponentModel.TypeConverter.ConvertToInvariantString(对象值)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.TryConvertToString(Object value, Type type, String& s)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeString(JsonWriter writer, Object value, JsonStringContract contract)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer,对象值,JsonContract valueContract,JsonProperty 成员,JsonContract collectionValueContract)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer,Object memberValue,JsonProperty 属性,JsonContract 合同)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract)
2011-12-14 11:23:39.9756|WARN|Glimpse.Core.Plumbing.GlimpseSerializer|Serializer 错误|Newtonsoft.Json.JsonWriterException--状态属性中的令牌 PropertyName 将导致无效的 JavaScript 对象。--在 Newtonsoft.Json .JsonWriter.AutoComplete(JsonToken tokenBeingWritten)
   在 Newtonsoft.Json.JsonWriter.WritePropertyName(字符串名称)
   在 Newtonsoft.Json.JsonTextWriter.WritePropertyName(字符串名称)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer,Object memberValue,JsonProperty 属性,JsonContract 合同)
   在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract)
...等等

对于我尝试用或无效NotSupportedException标记关联的模型/视图模型字段[NonSerialized]和属性,这似乎是症结所在,因为实现:[JsonIgnore][ScriptIgnore]CommandConverterRelayCommandICommand

[TypeConverter("System.Windows.Input.CommandConverter, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null"), ValueSerializer("System.Windows.Input.CommandValueSerializer, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
public interface ICommand

有谁知道如何解决这个问题?

另外,我无法解释JsonWriterException状态属性中的 Token PropertyName 会导致无效的 JavaScript 对象,似乎其他人也是。

有谁知道令牌 X状态 X指的是什么?

4

1 回答 1

2

这是一个已知问题 - 我很惊讶 JsonIgnore 没有起作用,因为它应该起作用......

更一般地说,自从引入视图模型的序列化以来,我们在做你“不应该”做的事情时遇到了问题。最大的例子是人们使用 EF/NH 模型作为他们的 VM,我们运行的序列化过程触发了整个数据库的递归延迟加载。

我们意识到让人们改变他们的代码来工作并不是一个好方法,因此我们将默认关闭序列化过程。

不幸的是,这还没有到位,所以我可以为您提供的东西不多,但知道我们已经完成了,我们很快就会修复。

更新:

我只是有一个想法。Glimpse 支持黑名单插件 - http://getglimpse.com/Help/Configuration。这意味着您可以阻止 Views 插件运行并导致问题。如果您仍然希望视图插件工作,您可以做一些更骇人听闻的事情是在第 73 行将“模型”设置为空 - https://github.com/Glimpse/Glimpse/blob/master/source/Glimpse.MVC3 /插件/Views.cs

我再次知道这两者都不是理想的,但它可以让你在此时此地启动并运行。

于 2011-12-15T19:44:13.767 回答