代码改变世界

在WCF中调用ArcObjects的一个例子

2011-08-29 10:24 贼寇在何方 阅读(...) 评论(...) 编辑 收藏

在使用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当中实现这个方法:

publicstring 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

 

添加代码:

staticvoid 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

 

参考链接

WCF 4.0 Issues with IIS 7.0 on x86 and x64 bit Machines