前几天做Geoserver相关服务的开发,就是利用restful方式完成shp的发布、删除之类的操作,但这些操作都需要得到Geoserver的认证才能进行。因为一直找不到解决方法,就先把用户权限认证全部关掉了,这样任何权限都可以对Geoserver进行各种操作了。
关掉权限认证后,shp文件的发布、删除操作都已经得到了解决,现在就应该回头看看这个认证问题了。在之前查资料时也看到过一些论坛讨论过类似的问题,不如这个Upload Shape File using GeoServer REST API and C#.当时我立刻保存了下来,相信以后会用到的。今天试了试里面的这句代码:
request.Credentials = new NetworkCredential("geoServer-username", "password");
失败了,提示‘No such workspace: quzhou’。这就比较尴尬了,用法基本相同,怎么就会得到不同的结果?是版本不同,还是我的请求方式不对(例子中是POST,我用的是PUT或DELETE),亦或者请求地址不正确?检查了很多遍,我发现请求地址截止到workspaces时,也就是http://localhost:8080/geoserver/rest/workspaces
时,并且请求方式为POST时,才会通过。我做了一个例子,生成一个workspace,完全没有问题。可就是使用完整的请求地址时,似乎是先报错,没有经过认证。搞不灵清,不知为什么,没有找到更好的方法来解决。
我继续在网上搜索其他解决方法,于是又见到了这个[Authentication in geoserver - POST method in asp.net],并试了其中这段代码:
string authInfo = "admin:geoserver";
req.Headers["Authorization"] = Convert.ToBase64String(Encoding.ASCII.GetBytes("Basic"+ authInfo));
还是败了,我似乎快要绝望了。我感觉我还是回头看看官方文档吧,于是找到了这一篇Authentication to OWS and REST services,上面说到"The default GeoServer configuration ships with support for HTTP Basic authentication for services."这说明它是支持basic authentication,但这个又是什么东西。好奇打开了链接,就是我尝试使用的方法二。再仔细看时发现了方法二中存在的端倪——方法二把“Basic ”也进行了base64编码。于是我小心地把basic
移动到前面:
string authInfo = "admin:geoserver";
request.Headers["Authorization"] = "Basic "+Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));
测试终于通过了。但我一直没有找到为什么第一种方式为什么行不通,再等等吧,也许过段时间我就知道为什么了。