在Azure Web角色上托管时,SqlGeometry/DbGeometry为有效异常

本文关键字:SqlGeometry DbGeometry 异常 有效 Web Azure 角色 | 更新日期: 2023-09-27 18:25:46

我正在尝试创建一个DbGeometry类型的多边形。它在我的本地计算机上运行良好,但在Azure Web角色上托管我的网站时,我在返回语句中遇到错误。

代码:

string polygon = “POLYGON ((-30.3637216 30.7124139,-30.3632216 30.7124139,-30.3632216 30.7129139,-30.3637216 30.7129139,-30.3637216 30.7124139))”;
return DbGeometry.FromText(polygon, 4326);

例外:

Exception has been thrown by the target of an invocation.

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Data.SqlClient.SqlSpatialServices.GeometryFromText(String geometryText)
   at Library.Modules.FindMyWay.SpatialFunctions.GetDefaultBox(Decimal latitude, Decimal longitude)
   at Library.Stop.ImportStops(String userName, IEnumerable`1 stops, Int32 companyId) Inner Exception:    at Microsoft.SqlServer.Types.GLNativeMethods.IsValid(GeoMarshalData g, Boolean& result)
   at Microsoft.SqlServer.Types.GLNativeMethods.IsValid(GeoData g)
   at Microsoft.SqlServer.Types.SqlGeometry.IsValidExpensive()
   at Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeometry.Parse(SqlString s)

你知道这个多边形为什么无效吗?

在Azure Web角色上托管时,SqlGeometry/DbGeometry为有效异常

好的,我通过将SqlGeometry转换为DbGeometry:来迂回地解决了这个问题

在.net 4.5 中有类似dbgeometry的东西有效吗

SqlGeometry geom = SqlGeometry.STPolyFromText(new SqlChars(new SqlString(polygon)), 4326);
                 return DbGeometry.FromBinary(geom.STAsBinary().Buffer);

此代码产生异常:

Unable to load DLL 'SqlServerSpatial.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

要修复:

无法加载DLL';SqlServerSpatial.dll';

64位dll导致此异常:

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

因此,我不得不将32位dll添加到项目中以使用Azure。

结果:现在很好,但我仍然不确定为什么DbGeometry不能在Azure上工作,也不确定为什么64位dll不能在Azure中工作。

我也遇到了同样的问题。我的解决方案是将以下Dll放在文件夹C:''windows/System32:中

SqlServerSpatial.dllSqlServerSpatial110.dll

实体框架根据以下来源使用这些dll:https://alastaira.wordpress.com/2011/08/19/spatial-applications-in-windows-azure-redux-including-denali/