SQL Server找不到序列化程序集

3

我正在尝试部署一个调用Web服务的UpdateContries SQL CRL存储过程,参考了这里找到的帮助:

所以基本上我有一个Visual Studio 2010上的Visual C# SQL CLR数据库项目,其中包含一个简单的存储过程,调用了作为Web引用添加的外部Web服务。

我把项目复制到了托管SQL Server 2008数据库的远程服务器上。

在项目属性中,我设置生成序列化程序集为“开启”,将数据库权限级别设置为“外部”,并激活了部署代码

此外,在项目中,我手动创建和删除了序列化程序集,如下所示:

PreDeployScript.sql

IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'ReportsWebServicesXML')
    DROP ASSEMBLY [ReportsWebServicesXML];
GO

PostDeployScript.sql

CREATE ASSEMBLY [ReportsWebServicesXML]
    FROM 'E:\Projects\Reports\ReportsWebServices\ReportsWebServices\bin\Debug\ReportsWebServices.XmlSerializers.dll'
    WITH PERMISSION_SET = SAFE;
GO

项目已成功构建和部署,我可以在 Visual Studio 2010 服务器资源管理器的 Assemblies 文件夹下看到 ReportsWebServices 和 ReportsWebServicesXML,但是当我尝试运行程序时,仍然返回以下错误:
Msg 6522, Level 16, State 1, Procedure UpdateContries, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "UpdateContries": 
System.InvalidOperationException: Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) and LoadModule() have been disabled by the host.
System.IO.FileLoadException: 
   at System.Reflection.Assembly.nLoadImage(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence evidence, StackCrawlMark& stackMark, Boolean fIntrospection)
   at System.Reflection.Assembly.Load(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence securityEvidence)
   at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
   at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
   at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] 
...
System.InvalidOperationException: 
   at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
   at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
   at System.Xml.Serialization.XmlSerializer.GetSerializersFromCache(XmlMapping[] mappings, Type type)
   at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type)
   at System.Web.Services.Protocols.SoapClientType..ctor(Type type)
   at System.Web.Services.Protocols.SoapHttpClientProtocol..ctor()
...

有什么提示吗?


不想无益,错误信息相当具体,谷歌搜索会给出关于Web服务和XML序列化的几个结果,这似乎与您的情况相关。您是否已经查阅了这些信息(甚至有一个微软KB文章),如果是,您尝试/学到了什么?这可能有助于避免人们发布您已经尝试过的建议。 - Pondlife
是的,我忘了在开头的信息中提到这一点。 我严格按照三个链接上的说明进行操作,然后回顾我的步骤,并尝试查找跟随教程的注释中的提示。 我还直接通过错误消息进行搜索,所有找到的帮助都指向序列化程序没有部署在数据库上,但正如我所说,它已经部署了,因为我可以在VS2010服务器资源管理器或SQL Server Management Studio中看到它在程序集文件夹中。 - nelson.t.cunha
1个回答

5
我在这里找到了解决方案... http://www.cstruter.com/blog/320

当序列化设置为自动/on并且您的项目中使用了webservice时,序列化程序集会自动生成到输出文件夹中(例如SourceAssembly.XmlSerializers.dll),您需要像以下代码片段中所示在SQL中注册该程序集:

CREATE ASSEMBLY CLRProcedures FROM 'C:\demos\CSTruter.com\CLRSQL\bin\Release\SourceAssembly.dll' 
WITH PERMISSION_SET = UNSAFE
GO
CREATE ASSEMBLY CLRSerializer FROM 'C:\demos\CSTruter.com\CLRSQL\bin\Release\SourceAssembly.XmlSerializers.dll' 
WITH PERMISSION_SET = UNSAFE
GO
CREATE PROCEDURE Test
AS EXTERNAL NAME [CLRProcedures].[CSTruter.com.StoredProcedures].[Test]"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接