Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Евгений 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] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Евгений SPYRYTUS, Это какие-то затыки с безопасностью. Кто-то куда-то кого-то не пускает. Копайте в этом направлении. |
27 фев 15, 13:54 [17321002] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
Евгений SPYRYTUS, А не пробовали сделать вашей сборке PERMISSION_SET = UNSAFE ? |
27 фев 15, 14:23 [17321205] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8317 |
UNSAFE требуется, скорее всего. EXTERNAL недостаточно. |
27 фев 15, 15:38 [17321776] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |