1、获得admin权限
当连接上ArcGIS Server,我们获取了IAGSServerConnectionAdmin,通过该对象我们获取了IServerObjectAdmin,通过该对象可以对Server进行管理
public IServerObjectAdmin ConnectAGS(string host, string username, string password)
{
try
{
IPropertySet propertySet = new PropertySetClass();
propertySet.SetProperty("url", host);
propertySet.SetProperty("ConnectionMode", esriAGSConnectionMode.esriAGSConnectionModeAdmin);
propertySet.SetProperty("ServerType", esriAGSServerType.esriAGSServerTypeDiscovery);
propertySet.SetProperty("user", username);
propertySet.SetProperty("password", password);
propertySet.SetProperty("ALLOWINSECURETOKENURL", true); //设置为false会弹出一个警告对话框
IAGSServerConnectionName3 pConnectName = new AGSServerConnectionNameClass() as IAGSServerConnectionName3;//10.1新增接口
pConnectName.ConnectionProperties = propertySet;
IAGSServerConnectionAdmin pAGSAdmin = ((IName)pConnectName).Open() as IAGSServerConnectionAdmin;
token = GenerateAGSToken_RESTAdmin(host, "arcgis", "arcgis");
return pAGSAdmin.ServerObjectAdmin;
}
catch (Exception exc)
{
Console.WriteLine("连接失败: {0}. Message: {1}", host, exc.Message);
return null ;
}
}
ConnectAGS("http://192.168.110.136:6080/arcgis/admin", "arcgis", "arcgis");
当获得了IAGSServerConnectionAdmin 这个接口我们进而可以获取IServerObjectAdmin,IServerObjectAdmin接口,
在帮助中看到了IDiscoveryServerObjectAdmin接口
2、 更改实例数
private void ChangInstance(IServerObjectAdmin pSAdmin, IServerObjectConfiguration pConf, int pMin, int pMax)
{
IEnumServerObjectConfiguration pEnServerConf = pSAdmin.GetConfigurations();
IServerObjectConfiguration pSConf = pEnServerConf.Next();
IServerObjectConfiguration pSOConfig = null;
while (pSConf != null)
{
if (pSConf.Name == pConf.Name && pSConf.TypeName == pConf.TypeName)
{
pSOConfig = pSConf;
break;
}
pSConf = pEnServerConf.Next();
}
if (pSConf != null)
{
pSConf.MinInstances = pMin;
pSOConfig.MaxInstances = pMax;
pSAdmin.UpdateConfiguration(pSOConfig);
}
}
3、 停止服务
pServerAdmin.StopConfiguration("Flow", "MapServer");
4 、删除服务
pServerAdmin.DeleteConfiguration("BusSimulation/DataPrep", "MapServer");//如果自己建立了目录请按照这种方式写,不然出错
5、 REST方式操作
ArcGIS 10.1 for Server可以通过http请求的方式访问,server接到请求后,然后响应,响应的结果是json格式的,对json格式我们可以自己去解析,但是这个很麻烦,在10.1中增加了很多对json格式处理的接口IJSONReader2,IJSONWriter等很多,我在这里偷懒直接使用了AO中自带的接口,如果不用AO中的这些接口,自己借助一些json的解析工具如:JSON.NET也是可以的。
6、获取token
public string GenerateAGSToken_RESTAdmin(string restAdmin, string username, string password)
{
try
{
if (restAdmin.EndsWith("\\"))
{
restAdmin = restAdmin.Substring(0, restAdmin.Length - 1);
}
if (restAdmin.EndsWith("services"))
{
restAdmin = restAdmin.Substring(0, restAdmin.Length - 9);
}
string loginUrl = restAdmin + "/generateToken";
WebRequest request = WebRequest.Create(loginUrl);
request.Method = "POST";
string credential = "username=" + username + "&password=" + password + "&client=requestip&expiration=&f=json";
byte[] content = Encoding.UTF8.GetBytes(credential);
request.ContentLength = content.Length;
request.ContentType = "application/x-www-form-urlencoded";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
IJSONReader2 pJsonReader = new JSONReaderClass();
IJSONObject pOb = pJsonReader.ParseJSONString(result) as IJSONObject;
string token;
if (pOb.TryGetValueAsString("token", out token))
{
}
return token;
}
catch { return ""; }
}
//""表示根目录
7、 停止服务
public bool StopService_RESTAdmin(string restAdmin, string username, string password, string serviceName, string pType, string pFolder)
{
try
{
// string token = GenerateAGSToken_RESTAdmin(restAdmin, username, password);
restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin;
if (pFolder.Length > 0)
{
pFolder = pFolder.StartsWith("/") ? pFolder : "/" + pFolder;
}
string serviceUrl = restAdmin + "/services" +pFolder+"/"+ serviceName + "." + pType + "/stop";
WebRequest request = WebRequest.Create(serviceUrl);
string postcontent = "f=pjson&token=" + token;
Byte[] content = Encoding.UTF8.GetBytes(postcontent);
request.ContentLength = content.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
return result.Contains("success");
}
catch { return false; }
}
8、 启动服务
public bool StartService_RESTAdmin(string restAdmin, string username, string password, string serviceName,string pServiceType,string pFolder)
{
try
{
// string token = GenerateAGSToken_RESTAdmin(restAdmin, username,password);
restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin;
if (pFolder.Length > 0)
{
pFolder = pFolder.StartsWith("/") ? pFolder : "/" + pFolder;
}
string serviceUrl = restAdmin + "/services" + pFolder + "/" + serviceName + "." + pServiceType + "/start";//服务名称+"."+类型
WebRequest request = WebRequest.Create(serviceUrl);
string postcontent = "f=pjson&token=" + token;
Byte[] content = Encoding.UTF8.GetBytes(postcontent);
request.ContentLength = content.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
return result.Contains("success");
}
catch { return false; }
}
9、 获取服务的目录,名称和类型
//目录,服务名称,类型
Dictionary<string, Dictionary<string, string>> pServiceType = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> pDic = new Dictionary<string, string>();
public Dictionary<string, Dictionary<string, string>> ListServices_RESTAdmin(string restAdmin, string username, string password, string folder)
{
try
{
//使用WebRequest 发送请求
restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin;
string serviceUrl = restAdmin + "/" + folder;
WebRequest request = WebRequest.Create(serviceUrl);
string postcontent = "f=json&token=" + token;
// json格式
Byte[] content = Encoding.UTF8.GetBytes(postcontent);
request.ContentLength = content.Length;
//
request.ContentType ="application/x-www-form-urlencoded";
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
int index = result.IndexOf("services");
Dictionary<string, string> pSer = new Dictionary<string, string>();
IJSONReader2 pJsonReader = new JSONReaderClass();
IJSONObject pOb = pJsonReader.ParseJSONString(result) as IJSONObject;
//"folders":["BusSimulation","System","Utilities"]
//根目录
pServiceType.Add("/", new Dictionary<string, string>());
IJSONArray pFodArr;
if(pOb.TryGetValueAsArray("folders",out pFodArr))
{
for (int i = 0; i < pFodArr.Count; i++)
{
pServiceType.Add(pFodArr.get_Value(i).ToString(), new Dictionary<string, string>());
}
}
if (pOb.MemberExists("services"))
{
object pJs;
if (pOb.TryGetValue("services", out pJs))
{
if (pJs is IJSONArray)
{
IJSONArray pArray = pJs as IJSONArray;
for (int i = 0; i < pArray.Count; i++)
{
if (pArray.get_Value(i) is IJSONObject)
{
IJSONObject pType = pArray.get_Value(i) as IJSONObject;
// {"folderName":"/","serviceName":"GZCache","type":"MapServer","description":""}
string folderName;
//服务的目录
if(pType.TryGetValueAsString("folderName",out folderName))
{
}
string serviceName;
//服务的名称
if(pType.TryGetValueAsString("serviceName",out serviceName))
{
}
string AGSType;
//服务的类型
if(pType.TryGetValueAsString("type",out AGSType))
{
}
pServiceType[folderName].Add(serviceName, AGSType);
}
}
}
}
}
}
catch { }
return pServiceType;
}
10、 删除服务
public bool DeleteService_RESTAdmin(string restAdmin, string username, string password, string serviceName,string pType,string pFolder )
{
try
{
//string token = GenerateAGSToken_RESTAdmin(restAdmin, username, password);
restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin;
if (pFolder.Length > 0)
{
pFolder = pFolder.StartsWith("/") ? pFolder : "/" + pFolder;
}
string serviceUrl = restAdmin + "/services" +pFolder+"/"+ serviceName + "." + pType + "/delete";
WebRequest request = WebRequest.Create(serviceUrl);
string postcontent = "f=pjson&token=" + token;
Byte[] content = Encoding.UTF8.GetBytes(postcontent);
request.ContentLength = content.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
return result.Contains("success");
}
catch { return false; }
}
11、 服务是否停止
public bool GetStatus_RESTAdmin(string restAdmin, string username, string password, string serviceName, string pServiceType, string pFolder)
{
try
{
// string token = GenerateAGSToken_RESTAdmin(restAdmin, username,password);
restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin;
string serviceUrl = restAdmin + "/services" + pFolder + "/" + serviceName + "." + pServiceType + "/status";//服务名称+"."+类型
WebRequest request = WebRequest.Create(serviceUrl);
string postcontent = "f=pjson&token=" + token;
Byte[] content = Encoding.UTF8.GetBytes(postcontent);
request.ContentLength = content.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(content, 0, content.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string result = reader.ReadToEnd();
return result.Contains("STOPPED");
}
catch { return false; }
}