签名程序集在SOAP反序列化上生成“应用程序已停止工作”

时间:2011-10-24 20:34:20

标签: c# serialization soap crash assemblies

我正在实例化一个对象,并使用SOAP数据填充它。

这曾经很好用。

但是,在给了程序集一个强名后,我收到以下错误:

error window

重要的一点是:

  

应用程序已停止工作

     

问题签名:System.Runtime.Serialization.Formatters.Soap

调试器向我显示System.Runtime.Serialization.SerializationException,其中包含以下详细信息。请注意序列化解析器如何抱怨“没有与Xml键关联的程序集”

debugger

完整的错误说明是:

  

解析错误,没有与Xml键a1关联的程序集:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull MainForm

这是StackTrace

  

at System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(String value,String xmlKey,String& assemblyString)

     

在System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessType(ParseRecord pr,ParseRecord objectPr)

     

在System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessAttributes(ParseRecord pr,ParseRecord objectPr)

     

在System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()

     

在System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()

     

在System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()

     

在System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler,ISerParser serParser)

     

在System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream,HeaderHandler handler)

     

at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream   serializationStream)

     

在C:\ MyProject \ Program.cs中的MyProject.Program.Main():第35行

     

在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)

     

在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)

     

at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

     

在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)

     

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)

     

在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)

     

在System.Threading.ThreadHelper.ThreadStart()

我取消选中“签署程序集”,重新构建解决方案,就像魔术一样,一切都恢复正常 - 所以,我知道一个错误的SOAP文件不是根本原因。事实上,如果我不得不猜测,我会说强大的程序集名称“令人困惑”的SOAP解串器。

如何解决此问题?

1 个答案:

答案 0 :(得分:8)

消息

  

解析错误,没有与Xml密钥关联的程序集   A1:HTTP://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull

表示数据已使用将PublicKeyToken设置为null的程序集序列化。这意味着在序列化时,此程序集没有强名称。

现在,如果您重新编译此程序集使用强名称对其进行签名,并在不更改序列化数据的情况下将其重新部署到原位,则程序集标识将不会被视为相同,并且反序列化代码将无法将其用于反序列化因此错误。

用于序列化和反序列化的程序集必须具有相同的全名(至少使用您使用的格式化程序和绑定程序)。

所以它可能是一个部署问题(确保序列化和反序列化程序集具有相同的全名),或者如果你真的需要能够处理具有不同全名的程序集(但这是不寻常的),你可以使用一个自定义绑定器,就像在这里完成的那样:Deserializing data into a dynamically loaded Assembly虽然我不推荐它用于标准操作。