对Azure二次开发,解决资源“独占访问”的问题

对Azure二次开发,解决资源“独占访问”的问题

在对Azure 进行二次开发过程中,首当其冲就是明白Azure的具体的”交互逻辑“,”消息机制“,”数据管理“,在说问题前,我想你对于Rest API 的使用,至少有了初步的了解。这里,我就不多说,微软给我最巨大的印象就是它的文档,如果,你还有些不了解,请参考“Microsoft Developer Network”的“服务管理Rest API参考”,链接是https://msdn.microsoft.com/zh-cn/library/ee460799.aspx;

 

那么下面我们就详细的讨论下,资源必须要独占访问的缘由:

打开IE ,访问Windows Azure 世纪互联的门户网站https://manage.windowsazure.cn/,先在Azure上创建一台虚机,因为下面我将会利用虚机的端口配置,去说明这个问题,让大家可以动手去操作端口,加深理解;

点击“虚机名称”,找到 ”端点“Tab页

下面我们就对当前虚机,进行端口的配置:

 

开始创建端口,这里,我就简单的配置下HTTP 80端口;

 

点击提交按钮后,你会有所发现,页面工具栏显示灰色,且不能点击

 

这里,细心的开发人员,会发现当前资源在被执行某个功能时,其他的按钮都无法操作,当然,除了”虚机端点“外,很多地方都是这样!

 

在利用Rest API 去发送请求后,它返回标准HTTP的状态代码,就好像页面视图执行操作后,返回”500“错误码一样。等同于,我利用API发送请求执行 某个虚机”新增端口”,这个过程,你可以通过Windows Azure 门户网站看到,正在新增端口,可这个时候,突然出现一次意外,我在第一次发送的新增端口请求,可还没有新增完成后,我又再次发送了一次“新增端口” 的请求。这时,我通过try catch 捕获到一条错误信息,提示“******某某资源必须要独占访问**********”(这里,我只是写个大概提示);

        这时,我必须在代码中添加  ”判断资源是否被独占访问中“ 逻辑,下面我就在代码中实现这个逻辑:

 

/// 返回部署的配置信息、状态和系统属性

        /// </summary>

        /// <param name="SubscriptionID"></param>

        /// <param name="ServiceName"></param>

        /// <param name="DeploymentName"></param>

        /// <returns></returns>

        public AzureVMDeploymentInfo GetAzureDeploymentInfo(string SubscriptionID, string ServiceName, string DeploymentName)

        {

            AzureVMDeploymentInfo rtn = null;

            RestClient client = GetAzureRestClient(this.ApiAddress, this.CertificatePath);

            var req = new RestRequest();

            req.AddHeader("Content-Type", "application/xml");

            req.Resource = SubscriptionID + "/" + "services/hostedservices/" + ServiceName + "/deployments/" + DeploymentName;

            var rep = client.Execute(req);

            rtn = GetAzureDeploymentInfo(rep);

            return rtn;

        }

 

/// 获取部署属性

        /// </summary>

        /// <param name="DeployResponse"></param>

        /// <returns></returns>

        private AzureVMDeploymentInfo GetAzureDeploymentInfo(IRestResponse DeployResponse)

        {

            AzureVMDeploymentInfo rtn = null;

            if (DeployResponse.StatusCode == HttpStatusCode.OK)

            {

                #region

                rtn = new AzureVMDeploymentInfo();

                var xmlContentDoc = System.Xml.Linq.XDocument.Parse(DeployResponse.Content);

                var rootNode = xmlContentDoc.Root;

 

                rtn = new AzureVMDeploymentInfo();

                rtn.DeploymentName = rootNode.Element(rootNode.Name.Namespace + "Name").Value;

                rtn.DeploymentSlot = rootNode.Element(rootNode.Name.Namespace + "DeploymentSlot").Value;

                rtn.Status = rootNode.Element(rootNode.Name.Namespace + "Status") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "Status").Value : "";

                rtn.PrivateID = rootNode.Element(rootNode.Name.Namespace + "PrivateID") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "PrivateID").Value : "";

                rtn.DeploymentLabel = rootNode.Element(rootNode.Name.Namespace + "Label") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "Label").Value : "";

                rtn.Url = rootNode.Element(rootNode.Name.Namespace + "Url") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "Url").Value : "";

                rtn.Configuration = rootNode.Element(rootNode.Name.Namespace + "Configuration") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "Configuration").Value : "";

                rtn.SdkVersion = rootNode.Element(rootNode.Name.Namespace + "SdkVersion") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "SdkVersion").Value : "";

                rtn.Locked = rootNode.Element(rootNode.Name.Namespace + "Locked") != null ?

                    bool.Parse(rootNode.Element(rootNode.Name.Namespace + "Locked").Value) : false;

                rtn.RollbackAllowed = rootNode.Element(rootNode.Name.Namespace + "RollbackAllowed") != null ?

                    bool.Parse(rootNode.Element(rootNode.Name.Namespace + "RollbackAllowed").Value) : false;

                rtn.VirtualNetworkName = rootNode.Element(rootNode.Name.Namespace + "VirtualNetworkName") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "VirtualNetworkName").Value : "";

                rtn.ReservedIPName = rootNode.Element(rootNode.Name.Namespace + "ReservedIPName") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "ReservedIPName").Value : "";

                rtn.InternalDnsSuffix = rootNode.Element(rootNode.Name.Namespace + "InternalDnsSuffix") != null ?

                    rootNode.Element(rootNode.Name.Namespace + "InternalDnsSuffix").Value : "";

                #endregion

 

            }

            else

            {

                HttpErrorCodeHandler(DeployResponse);

            }

            return rtn;

        }

 

 

        /// 处理RestAPI返回的异常信息

        /// </summary>

        /// <param name="rep"></param>

        private void HttpErrorCodeHandler(IRestResponse rep)

        {

            if (rep.StatusCode == HttpStatusCode.Accepted

                || rep.StatusCode == HttpStatusCode.Created

                || rep.StatusCode == HttpStatusCode.OK

                || rep.StatusCode == HttpStatusCode.NotFound)

            {

                return;

            }

 

            var ex = new AzureException();

            var error = GetError(rep);

            ex.ErrorMessage = error;

            ex.API_Http_Code = rep.StatusCode;

            throw ex;

        }

 

 

时间: 2024-10-12 21:35:20

对Azure二次开发,解决资源“独占访问”的问题的相关文章

[ECSHOP二次开发]解决分类商品Ajax连续请求导致的数据重复

0x00: 首先声明一个全局变量. var control = true; 然后,在滑动处罚ajax请求的代码处,做一个判断. if (control) { $('.get_more').click(); }; 这个地方是获取数据的函数以及ajax请求的函数 get_data: function() { var ile; control=false;    //首先进来这个函数之后吧全局变量设置成false以防重复请求 lock = true; target.children(".more_lo

个别二次开发电脑无法保存功能里面代码的解决方法

度量快速开发-平台在二次开发过程中,有极个别电脑上的开发客户端在二次开发的时候,书写的功能和事件中的代码,保存显示成功了的,但是重新打开后又没有. 排查方法:1.请检查客户端下面的autoupdate.exe,查看是否客户端是最新的,有没有升级文件未更新.2.如果是很久之前的客户端,中途升级多次后,突然出现,请检查客户端里面是否有升级异常的temp文件,有则删除.3.重新启动客户端,使用测试.4.客户端打开的时候,请使用管理员权限打开.5.卸载客户端,重新下载新客户端使用.6.检查电脑是否中毒,

Android应用插件式开发解决方法

Android应用插件式开发解决方法 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分拆整个应用了. 二.解决方案提出 一般有两种方式,一种是将应用按照功能分拆成多个应用,用户需要哪个就下载哪个,都需要就都下载.应用之间,可以在代码层面做一定的关联,以共享部分信息.另一种方式,类似于其他平台插件的方式,用户可以在主应用中可以选择性的下载需要的插件

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csdn.net/shulianghan VLC 二次开发 视频教程 : http://edu.csdn.net/course/detail/355 博客总结 : -- 本博客目的 : 让 Android 开发者通过看本博客能够掌握独立移植 VLC Media Player 核心框架到自己的 app 中,

Laravel入门及实践,快速上手社交系统ThinkSNS+二次开发

[摘要]自从社交系统ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门. 温馨提示: l 本文纯干货,文字和代码居多,且适合零基础Laravel学习者: l 本文会新建一个名为 blog 的 Laravel 程序,这是一个非常简单的博客. 本文主要内容: · 新建 Laravel 程序,如何连接数据库: · Laravel 程序的基本文件结构: · MVC(模

Dynamic CRM 2015学习笔记(4)修改开发人员资源(发现服务、组织服务和组织数据服务)url地址及组织名

在azure vm上安装了CRM 2015后 Dynamic CRM 2015学习笔记(1)Azure 上安装 CRM 2015, 发现了一个问题,那就是在设置 ->自定义项 –> 开发人员资源 里面的几个ulr(发现服务.组织服务和组织数据服务)都不对,显示的都是http://机器名/XRMServices/2011/ -, 但这个url是访问不了的,正确的url应该是 http://xxx.cloudapp.net/XRMServices/2011/ - 下面介绍如何修改成正确的url.

Moodle二次开发(1)-- 微创新

Moodle二次开发(1)-- 微创新 [复制链接] Moodle版本:2.1 1.用户登录后导向到我的主页 在Moodle中遍寻不到这个设置,我记得在2.3版本好像有.没办法只有仔细了看了下代码.发现 login/index.php中有段代码比较合符要求. /// Go to my-moodle page instead of site homepage if defaulthomepage set to homepage_my if (!empty($CFG->defaulthomepage

二次开发 提高财务软件与企业需求的匹配度

财务管理软件作为企业管理不可或缺的管理工具,能够帮助企业有效实现资金的科学管控,提高资金部署的精准度.并且,企业在选购财务管理软件时,甚少能够做到一锤子买卖,因为随着企业的不断发展壮大,势必要根据企业新的特点进行二次开发. 二次开发,在不少企业眼中认为或许是一种浪费资金的表现,因此总是希望能够购买一款能够一直用下去的财务管理软件.然而,这些企业却忽略了时代在变化,市场在变化,企业随着市场的变化也会进行新的发展方向转变. 对于这种转变,财务管理软件如果能够满足,自然是最好不过.如果不能,那么财务管

深入理解基于selenium的二次开发

对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是为了易于维护,很多人可能不懂得维护的价值是什么,和到底要维护什么.今天专门写一篇关于二次开发的文章,希望能够帮到有需要做二次开发的人.      二次开发也就是我们常说的封装selenium,或者做框架.但是一个框架要包含丰富的类和方法.要有一套完整的体系来帮助我们进行封装.可以说框架的设计思想就是整个框架的灵魂,如果设计思想很正确也就意味着这个框架成功