Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как связать: CLR + WCF + WebService  [new]
Евгений SPYRYTUS
Member

Откуда:
Сообщений: 2
Здравствуйте, ув. форумчане.

С чем работаю:
Microsoft® Visual Studio 2010.
Microsoft® MS SQL Server 2008 R2.

В общем у меня беда, сколько я уже переписал CLR хранимых процедур, не счесть, небыло никогда проблем с ними, но вот тут, при такой связке (CLR + WCF + WebService) - начались проблемы ...
Выкладываю, все, как есть, не знаю уже, куда рыть ...

Код:

public class RemoteWeather
{
    private static System.Data.SqlDbType GetSqlDbTypeFromClrType(System.Type clrType, out int size, out int precision)
    {
        size = 0;
        precision = 0;
        if (clrType == typeof(System.Boolean))
            return System.Data.SqlDbType.Bit;
        if (clrType == typeof(System.Byte))
            return System.Data.SqlDbType.TinyInt;
        if (clrType == typeof(System.Int16))
            return System.Data.SqlDbType.SmallInt;
        if (clrType == typeof(System.Int32))
            return System.Data.SqlDbType.Int;
        if (clrType == typeof(System.Int64))
            return System.Data.SqlDbType.BigInt;
        if (clrType == typeof(System.SByte))
            return System.Data.SqlDbType.SmallInt;
        if (clrType == typeof(System.UInt16))
            return System.Data.SqlDbType.Int;
        if (clrType == typeof(System.UInt32))
            return System.Data.SqlDbType.BigInt;
        if (clrType == typeof(System.UInt64))
        {
            size = 20;
            return System.Data.SqlDbType.Decimal;
        }
        if (clrType == typeof(System.Decimal))
        {
            size = 29;
            precision = 4;
            return System.Data.SqlDbType.Decimal;
        }
        if (clrType == typeof(System.Single))
            return System.Data.SqlDbType.Real;
        if (clrType == typeof(System.Double))
            return System.Data.SqlDbType.Float;
        if (clrType == typeof(System.String))
            return System.Data.SqlDbType.NVarChar;
        return System.Data.SqlDbType.Variant;
    }
 
 
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetWeatherByZIP(SqlString zip)
    {
        try
        {
            Microsoft.SqlServer.Server.SqlContext.Pipe.Send("Connecting ...\r\n");
            System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
            Weather.ServiceReference.WeatherSoapClient client = new Weather.ServiceReference.WeatherSoapClient(
                binding, new System.ServiceModel.EndpointAddress("http://wsf.cdyne.com/WeatherWS/Weather.asmx"));
            Microsoft.SqlServer.Server.SqlContext.Pipe.Send("Connected.\r\nTry to call GetCityWeatherByZIP ...\r\n");
            if (client != null)
            {
                Weather.ServiceReference.WeatherReturn result = null;
                object obj = client.GetCityWeatherByZIP(zip.Value);
                Microsoft.SqlServer.Server.SqlContext.Pipe.Send("Called sucessful.\r\nTry to get type of result ...\r\n");
                Type weatherType = result.GetType();
                List<Microsoft.SqlServer.Server.SqlMetaData> mds = weatherType.GetProperties().Select((System.Reflection.PropertyInfo pi) =>
                {
                    Microsoft.SqlServer.Server.SqlMetaData mdResult = null;
                    int size = 0;
                    int precision = 0;
                    System.Data.SqlDbType convert = GetSqlDbTypeFromClrType(pi.PropertyType, out size, out precision);
 
                    if (size == 0 && precision == 0 && pi.PropertyType != typeof(System.String))
                        new Microsoft.SqlServer.Server.SqlMetaData(pi.Name, convert);
                    else
                        if (pi.PropertyType == typeof(System.String))
                            new Microsoft.SqlServer.Server.SqlMetaData(pi.Name, convert, 4000, precision, SqlCompareOptions.None);
                        else
                            new Microsoft.SqlServer.Server.SqlMetaData(pi.Name, convert, size, precision, SqlCompareOptions.None);
 
 
                    return mdResult;
                }).ToList();
                Microsoft.SqlServer.Server.SqlContext.Pipe.Send("Connected !!!\r\nTry to get result ...\r\n");
                Microsoft.SqlServer.Server.SqlDataRecord ret = new Microsoft.SqlServer.Server.SqlDataRecord(mds.ToArray());
                Microsoft.SqlServer.Server.SqlContext.Pipe.SendResultsStart(ret);
                ret.SetValues(weatherType.GetProperties().Select(i => i.GetValue(result, null)).ToArray());
                Microsoft.SqlServer.Server.SqlContext.Pipe.SendResultsRow(ret);
                Microsoft.SqlServer.Server.SqlContext.Pipe.SendResultsEnd();
                Microsoft.SqlServer.Server.SqlContext.Pipe.Send("Connected - HUR-A-A-A-A-A !!!\r\n");
            }
            else
                Microsoft.SqlServer.Server.SqlContext.Pipe.Send("OH !!! - Object is NULL !!!\r\n");
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}


Permission Level: External.
Generate serialization assembly: On.

В MSSQL Server 2008 R2, выполнил:
ALTER DATABASE MyDB SET TRUSTWORTHY ON


И добавил сборки:
Weather.dll - External Access.
Weather.XmlSerializers.dll - Safe.

Вызываю хранимую процедуру и получаю:
Connecting ...
Msg 6522, Level 16, State 1, Procedure GetWeatherByZIP, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "GetWeatherByZIP":
System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host.
 
The protected resources (only available with full trust) were: All
The demanded resources were: Synchronization, ExternalThreading
 
System.Security.HostProtectionException:
   в RemoteWeather.GetWeatherByZIP(SqlString zip)


Что делать ? - что это за бред ? - я уже три дня бъюсь головой ...

Подскажите пожалуйста, что это может быть ... :oops:

Заранее благодарен, очень жду ответа.
27 фев 15, 10:30    [17319542]     Ответить | Цитировать Сообщить модератору
 Re: Как связать: CLR + WCF + WebService  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Евгений SPYRYTUS,

Это какие-то затыки с безопасностью. Кто-то куда-то кого-то не пускает. Копайте в этом направлении.
27 фев 15, 13:54    [17321002]     Ответить | Цитировать Сообщить модератору
 Re: Как связать: CLR + WCF + WebService  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
a_voronin,

Возможно вам надо правильно задействовать вот эти вещи. Но это уже больше вопросы .NET . Не парьтие ими SQL форум.
https://msdn.microsoft.com/en-us/library/system.net.networkcredential(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/w070t6ka(v=vs.110).aspx
27 фев 15, 13:58    [17321030]     Ответить | Цитировать Сообщить модератору
 Re: Как связать: CLR + WCF + WebService  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Евгений SPYRYTUS,

А не пробовали сделать вашей сборке PERMISSION_SET = UNSAFE ?
27 фев 15, 14:23    [17321205]     Ответить | Цитировать Сообщить модератору
 Re: Как связать: CLR + WCF + WebService  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
UNSAFE требуется, скорее всего. EXTERNAL недостаточно.
27 фев 15, 15:38    [17321776]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить