Member 13017290 Ответов: 1

Ошибка при использовании веб-службы из SQL server


Я разрабатываю решение, в котором вызываю веб-службу из SQL Server с помощью хранимой процедуры.
Я пишу код CLR в Visual Studio 2015 C#
SQL Server имеет версию 2008 с .NET Framework 3.5.1 (SQL Server и Visual studio установлены на разных серверах)

Если я делаю вызов веб-службы из программы C# в моем решении Visual Studio, он работает нормально, но когда я делаю вызов из хранимой процедуры, я получаю это сообщение об ошибке:
"Не удалось загрузить файл или сборку' \..(путь)..\Database1.XmlSerializers.dll ' или одна из ее зависимостей. Система не может найти указанный файл."
StackTrace: at System.Отражение.AssemblyName.nGetFileInformation(строка s)
в системе.Отражение.Имя сборки.GetAssemblyName(String assemblyFile)
в StoredProcedures.SqlStoredProcedure1(строка землю)

Что я уже пробовал:

В моем проекте базы данных я публикую сборку сериализатора ("C:\Program файлы (x86)\Microsoft SDKs\Windows\v7.0A\Bin\sgen.exe" / force " $(TargetPath)")

В файл reference. cs я добавил [System. Xml.Serialization.XmlSerializerAssemblyAttribute] с путем к сборке сериализатора.

Я временно отключил настройки исключений CLR, чтобы предотвратить создание исключений для прерывания выполнения.

Я проверил зависимости сборки сериализатора и нашел три сборки. Я поместил эти три сборки в тот же каталог, что и сборка сериализатора.

Во время тестирования я использую уровень разрешений UNSAFE в проекте базы данных.

Я пробовал использовать как "добавить ссылку на службу", так и "добавить веб-ссылку" для создания прокси-сервера для веб-службы

Я был бы признателен за помощь в решении этой проблемы.

С уважением
Кристер

CHill60

Вы упомянули, что SQL Server и VS установлены на разных серверах. Есть ли у вас DLL, установленная на том же сервере, что и SQL Server (так как именно там работает SP)?

Member 13017290

Да, библиотека DLL сериализатора установлена на SQL Server:

Создать сборку [Database1.XmlSerializers]
Разрешение ДБО
Из ' \..Пути..\Database1.XmlSerializers.dll'
С PERMISSION_SET = НЕБЕЗОПАСНО

CHill60

Это была всего лишь мысль :)

RedDk

Я не знаю, что может вызвать это, потому что моя работа с созданием функций CLR, которые используются SQL Server, ограничена и обычно приводится на примере, опубликованном здесь в CP. Но это не помешало бы мне по-прежнему ходить в такие места, как CODEPLEX, и искать проекты CLR, которые делают именно такие вещи, проверять код и дублировать метод до зубов.

Member 13017290

Спасибо за совет. Я искал на сайте Codeplex, но, к сожалению, не нашел там ничего, что помогло бы мне.

NightWizzard

Может быть, учетная запись Windows, в которой работает ваш веб-сервис,не имеет разрешения на доступ к DLL?

Member 13017290

Нет, настройки разрешений верны, так что здесь дело не в этом.

Member 13017290

Да, я зарегистрировал сборку сериализации (см. Мой ответ на первый комментарий в этой статье). Я также попытался установить уровень разрешений SAFE и EXTERNAL_ACCESS для сборки при ее создании в SQL Server, но все равно получаю ту же ошибку.

1 Ответов

Рейтинг:
2

Badal Kumar

Следовать инструкциям:

1. Поместите библиотеку DLL на SQL server в определенное место, например:

C:\CRLProject\Database1.XmlSerializers.dll


2. Выполните приведенный ниже SQL-запрос для установки сборки

 EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MySqlCLRProject')
BEGIN
	DROP ASSEMBLY MySQLCLRProject
	ALTER ASSEMBLY MySQLCLRProject
	FROM 'C:\CRLProject\Database1.XmlSerializers.dll'
	WITH PERMISSION_SET = UNSAFE ;
END
ELSE
BEGIN
	CREATE ASSEMBLY MySQLCLRProject
	FROM 'C:\CRLProject\Database1.XmlSerializers.dll'
	WITH PERMISSION_SET = UNSAFE;
END




3. Используйте хранимую процедуру, как указано ниже

T ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[dsp_SampleCLRSP]
@dataList [nvarchar](max)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [MySQLCLRProject].[StoredProcedures].[dsp_CLRGetSampleList]
GO


4. выполните следующую команду базы данных

ALTER DATABASE Database1 SET TRUSTWORTHY ON


5. Выполните указанную ниже команду

CLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::Database1 TO [<big>somedvuser</big>]' 

SELECT @Command = REPLACE(REPLACE(@Command 
            , 'Database1', SD.Name)
            , 'DomainName\<big>yoursqluserid</big>', SL.Name)
FROM master..sysdatabases SD 
JOIN master..syslogins SL ON  SD.SID = SL.SID
WHERE  SD.Name = DB_NAME()

PRINT @Command
EXEC(@Command)



Пожалуйста, дайте нам знать, если вы все еще сталкиваетесь с этой проблемой.


Member 13017290

Да, у меня все еще есть проблема.
Если я проверю текущую настройку Sql Server с помощью "SELECT suser_sname(owner_sid) FROM sys. databases where name = 'MyTstDB'"
Я получаю такой результат: MyDomainName\administrator, и это учетная запись домена, которую я использую в своем проекте SQL CLR.