Развертывание сборки клиента WCF в SQL2005

Я пытаюсь развернуть сборку клиента WCF в SQL 2005. Это означает, что мне нужно создать / зарегистрировать зависимости для моего клиента WCF, а именно:

  • System.Runtime.Serialization
  • System.Web
  • System.ServiceModel

С помощью этого скрипта:

CREATE ASSEMBLY System_Runtime_Serialization FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY System_Web FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll'
WITH PERMISSION_SET = UNSAFE
GO


CREATE ASSEMBLY System_ServiceModel FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.ServiceModel.dll'
WITH PERMISSION_SET = UNSAFE
GO

Регистрация System.Web.dll завершается ошибкой с таким сообщением об ошибке:

Assembly 'System.Web' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.

person Sander Rijken    schedule 30.12.2008    source источник


Ответы (4)


ОК, понял это:

Я думаю, это происходит потому, что я использую 64-битную систему. Я пытался добавить 32-разрядную версию System.Web на 64-разрядный SQL Server (и я думаю, что 32-разрядная версия действительно ссылается на 64-разрядную версию).

Во всяком случае, для справки рабочий код ниже:

CREATE ASSEMBLY System_Runtime_Serialization FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY System_Web FROM 'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY System_IdentityModel FROM 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE ASSEMBLY System_IdentityModel_Selectors FROM 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY System_Messaging FROM 'c:\windows\Microsoft.net\Framework\v2.0.50727\System.Messaging.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY System_ServiceModel FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.ServiceModel.dll'
WITH PERMISSION_SET = UNSAFE
GO
person Sander Rijken    schedule 31.12.2008
comment
Мне пришлось добавить System.IdentityModel и System.IdentityModel.Selectors из программных файлов (x86), чтобы избежать исключения FileLoadException в System.Runtime.Serialization. - person Mark Brackett; 29.01.2009

У меня была такая же проблема, но с клиентской сборкой, которую я написал сам. Более простым решением было перекомпилировать мои сборки с установкой Platform Target на «AnyCPU» вместо «x86», что сделало их приемлемыми для 64-битной системы, на которой работает SQL Server.

  1. Щелкните правой кнопкой мыши проект VS и выберите Свойства.
  2. Щелкните вкладку «Сборка» на левом краю окна «Свойства».
  3. Измените значение целевой платформы с x86 на AnyCpu.
  4. Перекомпилируйте.
  5. Переустановите сборку в SQL Server.

По общему признанию, это решение не поможет в вашем случае, когда сборки были предоставлены Microsoft и не могут быть перекомпилированы, однако я хотел ответить за других людей с пользовательскими сборками, которым эта страница может оказаться полезной, как и я.

person Phoeniceus Agelaius    schedule 12.10.2011

Кажется, это решает эту проблему для других людей.

Я просто попробовал этот же оператор на моей установке SQL Server 2005 SP2, и он работал нормально. Я предполагаю, что ваша установка .NET framework, особенно System.Web, повреждена, поскольку ссылается на себя. Можете ли вы попробовать это в любой другой системе или попробовать переустановить платформу .NET?

Это пришло из MSDN, и человек с исходной проблемой сказал, что проблема решена.

person Sailing Judo    schedule 30.12.2008

просто чтобы сказать ... Я не уверен, что размещение клиента WCF внутри SQL-Server является особенно желательным вариантом. Есть несколько вариантов использования SQL / CLR, например, если вы (по какой-либо причине) хотите использовать в базе данных специальные типы .NET или (что более вероятно) вам нужны некоторые очень узкие служебные методы, такие как Split, Regex и т. д. Однако я бы не стал запускать свою основную логику приложения (например, клиенты WCF) внутри среды выполнения SQL.

Самое близкое, что я мог бы получить, - это иметь таблицу очереди в базе данных и иметь работу службы Windows по удалению из очереди, обрабатывать ее и отмечать ее как завершенную (или удалять). Это позволяет масштабировать такую ​​работу без перегрузки базы данных.

Я уверен, что это может сработать ... Я просто не стал бы этого делать сам.

person Marc Gravell    schedule 30.12.2008
comment
Я планирую создать функцию CLR. Мне нужно объединить данные из веб-службы с данными из SQL Server для использования в службах отчетов SQL Server. Я знаю, что из SSRS можно выполнять вызовы WS, но к ним нельзя присоединиться. - person Sander Rijken; 31.12.2008