Вызов службы WCF из процедуры SQL CLR в C # - PullRequest
3 голосов
/ 17 сентября 2010

Я пытаюсь вызвать службу WCF из хранимой процедуры SQL, написанной на C #.

Я видел различные посты или вопросы на одну и ту же тему: Вызов службы WCF из хранимой процедуры SQL CLR Хранимая процедура и веб-служба SQL CLR

Но есть кое-что, чего я не понимаю. Чтобы иметь возможность вызывать мою службу WCF из хранимой процедуры, я создаю клиента WCF в коде C # процедуры:

    //Create an endpoint addresss for our service
    public static EndpointAddress endpoint =
      new EndpointAddress(new Uri("http://localhost:32226/ServiceName.svc"));
    //Create a binding method for our service
    public static WSHttpBinding HttpBinding = new WSHttpBinding();
    //Create an instance of the service proxy
    public static ChannelFactory<IServiceName> MyChannelFactory = new ChannelFactory<IRecursosHumanos>(HttpBinding, endpoint);

    // Create a channel.
    public static IRecursosHumanos ServicioRrhh = MyChannelFactory.CreateChannel();

Я компилирую проект как .NET 3.0+, чтобы иметь возможность его скомпилировать (Ссылка на Sytem.ServiceModel). Когда я пытаюсь развернуть его на SQL Server, я получаю следующее сообщение:

Msg 10301, Level 16, State 1, Line 2
Assembly 'MyAssembly' references assembly 'system.runtime.serialization, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.', 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: 2(failed to retrieve text for this error. Reason: 15105)). Please load the referenced assembly into the current database and retry your request.

Должен ли я зарегистрировать эту сборку также на сервере? как нужны сборки для WCF? Разве я не повредил бы сервер, добавив столько сборок?

Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2010

Это должно работать, если вы используете веб-ссылку в сборке CLR вместо ссылки на службу.

1 голос
/ 17 декабря 2014

После 2 дней проб и ошибок у меня наконец-то все заработало, вот так:

(На Windows Server 2008 x64, 64-разрядная версия SQL Server 2008, сборка DLL, созданная с помощью Framework3.0, Любой процессор ).Я предлагаю вам придерживаться .Net 3 для SQL 2008.

alter database [TTBackup]
set trustworthy on;
go
USE TTBackup
--Register the assemblies referenced by our assembly.
CREATE ASSEMBLY SMdiagnostics AUTHORIZATION dbo FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM 'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.Runtime.Serialization.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.IdentityModel.Selectors] FROM 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll' with permission_set = unsafe 
CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [Microsoft.Transactions.Bridge] FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll' with permission_set = unsafe 

--register our assembly
CREATE ASSEMBLY [TTDatabaseIntegration] AUTHORIZATION dbo FROM 'D:\TTDatabaseIntegration.dll' WITH permission_set = unsafe
GO
--Register the UDF from CLR
CREATE FUNCTION [ListImportTemplates]( ) RETURNS TABLE(TemplateID int, TemplateName NVARCHAR(4000))
AS EXTERNAL NAME [TTDatabaseIntegration].[UserDefinedFunctions].[ListImportTemplates]
GO 

--Test my function 
select  * FROM dbo.[ListImportTemplates]()

Обратите внимание, что большинство библиотек DLL, на которые есть ссылки, являются 32-разрядными, а System.Web - 64-разрядными.(Это единственный способ, которым он работает для меня).

Примечания:

  1. Сначала я зарегистрировал 64-разрядные сборки, но он выдавал исключение времени выполнения: System.IO.FileLoadException: Could not load file or assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. Assembly in host store has a different signature than assembly in GAC. (Exception from HRESULT: 0x80131050) See Microsoft Knowledge Base article 949080 for more information.

    В итоге я сравнил файлы (по размеру) в GAC с теми, которые я регистрировал в SQL.(GAC находится в C: \ Windows \ assembly, но вы не можете просмотреть папку в Explorer, для этого я использовал Total Commander .) Вот как я обнаружил, что версия в GAC - это32-битная версия.

  2. Вы можете просмотреть зарегистрированные сборки по этому запросу: SELECT * FROM sys.assemblies

Ссылки (объяснение пошагово):

  1. http://nielsb.wordpress.com/sqlclrwcf/
  2. http://hyper -choi.blogspot.ro / 2011/07 / sql-2008-call-wcf-service-from.html
0 голосов
/ 17 сентября 2010

SQL Server понадобится ваша сборка, чтобы загрузить CLR Sproc, поскольку он скомпилирован с ним.Вам необходимо добавить его в GAC на сервере.Я не знаю, что вы имеете в виду «повредить сервер»

...