在WCF中调用ArcObjects的一个例子
在使用ArcGIS Web API开发GIS应用的时候,系统提供的一般服务常常不能满足需要,这时候就需要在服务端调用ArcObjects。
下面就把我就给出一个简单的示例程序,用来读取给定的Personal Geodatabase中要素类的一个列表,并把相关的一些经验分享一下:
系统环境
Windows 7 SP1 中文专业版(64位)
ArcGIS 10 Server SP2
Visual Studio 2010 SP1
创建一个 WCF服务应用程序
新建项目->WCF->WCF服务应用程序,我的项目名称:WCFWithArcObjects
添加四个引用
ESRI.ArcGIS.DataSourceGDB
ESRI.ArcGIS.Geodatabase
ESRI.ArcGIS.System
ESRI.ArcGIS.Version
给ArcObjectsService添加构造方法
public ArcObjectsService()
{
RuntimeManager.Bind(ProductCode.Server);
// 初始化许可证
var aoi = new AoInitialize();
var productCode = esriLicenseProductCode.esriLicenseProductCodeArcServer;
aoi.Initialize(productCode);
}
给IArcObjectsService添加方法:
[OperationContract]
string ShowFeatureClasses();
并在ArcObjectsService.svc当中实现这个方法:
public string ShowFeatureClasses()
{
try
{
// 打开Personal Geodatabase
var factory = new AccessWorkspaceFactory();
var workspace = factory.OpenFromFile(@"E:\数据\经开区数据.mdb", 0);
// 遍历数据集
var enumDataset = workspace.Datasets[esriDatasetType.esriDTAny];
var dataset = enumDataset.Next();
var sb = new StringBuilder();
while (dataset != null)
{
var featureClass = dataset as IFeatureClass;
if (featureClass != null)
sb.AppendLine(featureClass.AliasName);
dataset = enumDataset.Next();
}
if (sb.Length == 0)
return "没有要素类";
return "包含以下要素类:" + Environment.NewLine + sb;
}
catch (Exception e)
{
return "服务端错误:" + e.Message;
}
}
发布服务
接着发布WCF服务
我给的目录是C:\inetpub\wwwroot\WCFWithArcObjects,对应的Url是http://127.0.0.1/WCFWithArcObjects/
在IIS 管理器中把这个目录“转换为应用程序”
创建一个Console,添加服务引用
创建命令行应用程序WCFWithArcObjectsConsoleTest,
添加服务引用(http://127.0.0.1/WCFWithArcObjects/ServiceArcObjects.svc)
添加代码:
static void Main(string[] args)
{
var service = new ArcObjectsServiceClient();
try
{
Console.WriteLine(service.ShowFeatureClasses());
}
catch (Exception e)
{
Console.WriteLine("客户端错误:"+ e.Message);
}
Console.ReadKey();
}
调试下,只见一个错误:
这个错误是什么原因呢?
解决问题
这是个只在部署的时候出现的非常恶心的错误!!如果我们引用的是以调试方式执行的WCF服务,就完全没有问题。
问题在于ArcObjects必须在X86环境下执行,而我的系统是64位的,所以解决方法如下:
(1) WCF项目属性->生成->目标平台,这里改成X86
(2) 重新发布WCF服务
(3) 打开IIS管理器,添加新的应用程序池,.Net版本4.0,在其高级设置中启用32位应用程序:
(4) 设置WCFWithArcObjects的高级属性,更改到刚才创建的应用程序池
(5) 更新服务引用
再次调试,结果出来了:
附上源码:WCFWithArcObjects.7z
依赖于ArcGIS10的ArcObjects SDK for .Net