예제 #1
0
        private WpsProcessOffering CreateProcess(bool proxy)
        {
            WpsProvider        provider = CreateProvider("test-wps-" + proxy.ToString(), "test provider " + (proxy ? "p" : "np"), "http://dem.terradue.int:8080/wps/WebProcessingService", proxy);
            WpsProcessOffering process  = CreateProcess(provider, "com.test.provider", "test provider " + (proxy ? "p" : "np"), true);

            return(process);
        }
예제 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:Terradue.Tep.WebServer.WebServiceTep"/> class.
 /// </summary>
 /// <param name="context">Context.</param>
 /// <param name="entity">Entity.</param>
 public WebServiceTep(IfyContext context, WpsProcessOffering entity) : base(entity)
 {
     this.IsPublic   = entity.DoesGrantPermissionsToAll();
     this.OwnerId    = entity.UserId;
     this.Geometry   = entity.Geometry;
     this.Commercial = entity.Commercial;
 }
예제 #3
0
        /// <summary>
        /// Post the specified request.
        /// </summary>
        /// <returns>The post.</returns>
        /// <param name="request">Request.</param>
        public object Post(CommunityAddWpsServiceRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);

            try {
                context.Open();
                context.AccessLevel = EntityAccessLevel.Privilege;
                context.LogInfo(this, string.Format("/community/{{Identifier}}/service/wps/{{WpsIdentifier}} POST Identifier='{0}' , WpsIdentifier='{1}'", request.Identifier, request.WpsIdentifier));
                var domain = ThematicCommunity.FromIdentifier(context, request.Identifier);
                if (!domain.CanUserManageService(context.UserId))
                {
                    throw new UnauthorizedAccessException(CustomErrorMessages.ADMINISTRATOR_ONLY_ACTION);
                }
                var wps = WpsProcessOffering.FromIdentifier(context, request.WpsIdentifier);
                wps.AccessLevel = EntityAccessLevel.Privilege;
                wps.Domain      = domain;
                wps.Store();
                context.LogDebug(this, string.Format("Wps service added to Community {0}", domain.Identifier));
                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new WebResponseBool(true));
        }
예제 #4
0
        /// <summary>
        /// Tos the entity.
        /// </summary>
        /// <returns>The entity.</returns>
        /// <param name="context">Context.</param>
        public WpsProcessOffering ToEntity(IfyContext context, WpsProcessOffering input)
        {
            WpsProcessOffering entity = (Terradue.Portal.WpsProcessOffering)base.ToEntity(context, input);

            entity.RemoteIdentifier = this.RemoteIdentifier;

            return(entity);
        }
예제 #5
0
        public void GetAtomItemWithoutProxy()
        {
            WpsProcessOffering process = CreateProcess(false);
            var entry = process.ToAtomItem(new NameValueCollection());
            OwsContextAtomEntry result = new OwsContextAtomEntry(entry);

            Assert.That(result != null);
        }
예제 #6
0
        /// <summary>
        /// Tos the entity.
        /// </summary>
        /// <returns>The entity.</returns>
        /// <param name="context">Context.</param>
        public new WpsProcessOffering ToEntity(IfyContext context, WpsProcessOffering input)
        {
            WpsProcessOffering entity = base.ToEntity(context, input);

            entity.Geometry   = this.Geometry;
            entity.Commercial = this.Commercial;
            return(entity);
        }
예제 #7
0
        public void SearchWpsServicesByQ()
        {
            var         uid      = Guid.NewGuid().ToString();
            WpsProvider provider = CreateProvider(uid, "test provider", "http://gpod.eo.esa.int/wps?service=WPS&version=1.0.0&request=GetCapabilities", true);

            provider.UpdateProcessOfferings(true);

            EntityList <WpsProcessOffering> wpsProcessList = new EntityList <WpsProcessOffering>(context);

            wpsProcessList.Template.Provider = provider;
            wpsProcessList.Load();

            var nbprocesses = wpsProcessList.Items.Count();

            WpsProcessOffering service1 = wpsProcessList.Items.First();

            service1.Identifier  = "searchbyQidentifier";
            service1.Name        = "searchbyQname";
            service1.Description = "searchbyQdescription";
            service1.Store();

            EntityList <WpsProcessOffering> services = new EntityList <WpsProcessOffering>(context);

            var parameters = new NameValueCollection();

            parameters.Set("count", (nbprocesses + 1) + "");

            IOpenSearchResultCollection osr = ose.Query(services, parameters);

            parameters.Set("q", "searchbyNoQidentifier");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(0, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("q", "searchbyQ");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("q", "searchbyQidentifier");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("q", "searchbyQname");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("q", "searchbyQdescription");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            provider.Delete();
        }
예제 #8
0
        private WpsProcessOffering CreateProcess(WpsProvider provider, string identifier, string name)
        {
            WpsProcessOffering process = new WpsProcessOffering(context);

            process.Name             = name;
            process.Description      = name;
            process.RemoteIdentifier = identifier;
            process.Identifier       = Guid.NewGuid().ToString();
            process.Url      = provider.BaseUrl;
            process.Version  = "1.0.0";
            process.Provider = provider;
            return(process);
        }
예제 #9
0
        /// <summary>
        /// Get Wps Processing Offering from DescribeProcess url
        /// </summary>
        /// <param name="describeProcessUrl"></param>
        /// <returns></returns>
        public static WpsProcessOffering GetProcessingFromDescribeProcessWps3(IfyContext context, string describeProcessUrl)
        {
            var wps3 = GetWps3ProcessingFromDescribeProcess(describeProcessUrl);

            WpsProcessOffering process = new WpsProcessOffering(context);

            process.Identifier       = Guid.NewGuid().ToString();
            process.RemoteIdentifier = wps3.Process.Id;
            process.Name             = wps3.Process.Title;
            process.Description      = wps3.Process.Abstract ?? wps3.Process.Title;
            process.Version          = wps3.Process.Version;
            process.Url = describeProcessUrl;

            return(process);
        }
예제 #10
0
        private WpsJob CreateWpsJob(string name, WpsProcessOffering wps, User owner)
        {
            WpsJob wpsjob = new WpsJob(context);

            wpsjob.Name             = name;
            wpsjob.RemoteIdentifier = Guid.NewGuid().ToString();
            wpsjob.Identifier       = name;
            wpsjob.OwnerId          = owner.Id;
            wpsjob.WpsId            = wps.Provider.Identifier;
            wpsjob.ProcessId        = wps.Identifier;
            wpsjob.CreatedTime      = DateTime.UtcNow;
            wpsjob.DomainId         = owner.DomainId;
            wpsjob.Parameters       = new List <KeyValuePair <string, string> >();
            wpsjob.StatusLocation   = "http://dem.terradue.int:8080/wps/WebProcessingService";
            return(wpsjob);
        }
예제 #11
0
        public void GetProcessOfferingEntityList()
        {
            WpsProvider        provider = CreateProvider("test-wps-1", "test provider 1", "http://dem.terradue.int:8080/wps/WebProcessingService", false);
            WpsProcessOffering process  = CreateProcess(provider, "com.test.provider.1", "test provider 1", false);

            process.Store();
            Assert.IsFalse(process.Available);
            WpsProvider        provider2 = CreateProvider("test-wps-2", "test provider 2", "http://dem.terradue.int:8080/wps/WebProcessingService", false);
            WpsProcessOffering process2  = CreateProcess(provider2, "com.test.provider.2", "test provider 2", false);

            process2.Store();
            Assert.IsFalse(process2.Available);
            EntityList <WpsProcessOffering> processes = provider.GetWpsProcessOfferings(false);

            Assert.That(processes.Count == 1);
            provider.Delete();
            provider2.Delete();
        }
예제 #12
0
        public static WpsProcessOffering GetWpsProcessOfferingFromProcessDescriptionAtomFeed(IfyContext context, OwsContextAtomEntry entry)
        {
            var wpsOffering = entry.Offerings.FirstOrDefault(of => of.Code == "http://www.opengis.net/spec/owc/1.0/req/atom/wps");

            if (wpsOffering == null)
            {
                return(null);
            }

            var wps = new WpsProcessOffering(context);

            wps.Identifier = Guid.NewGuid().ToString();
            var identifiers = entry.ElementExtensions.ReadElementExtensions <string>("identifier", "http://purl.org/dc/elements/1.1/");

            if (identifiers.Count > 0)
            {
                wps.RemoteIdentifier = identifiers[0];
            }
            wps.Name        = entry.Title != null ? entry.Title.Text : "";
            wps.Description = entry.Summary != null ? entry.Summary.Text : "";

            var appIconLink = entry.Links.FirstOrDefault(l => l.RelationshipType == "icon");

            if (appIconLink != null)
            {
                wps.IconUrl = appIconLink.Uri.AbsoluteUri;
            }

            var operation          = wpsOffering.Operations.FirstOrDefault(o => o.Code == "ProcessDescription");
            var href               = operation.Href;
            var dpUri              = new Uri(href);
            var describeProcessUrl = dpUri.GetLeftPart(UriPartial.Path);

            wps.Url = describeProcessUrl;

            operation = wpsOffering.Operations.FirstOrDefault(o => o.Code == "ValidateProcess");
            if (operation != null)
            {
                wps.ValidationUrl = operation.Href;
            }

            return(wps);
        }
예제 #13
0
        public void SearchWpsServicesByTags()
        {
            WpsProvider        provider = CreateProvider("test-wps-search-1", "test provider 1", "http://dem.terradue.int:8080/wps/WebProcessingService", false);
            WpsProcessOffering process  = CreateProcess(provider, "com.test.provider.1", "test provider 1", true);

            process.AddTag("mytag");
            process.AddTag("mytag1");
            process.AddTag("mytag2");
            process.Store();

            EntityList <WpsProcessOffering> services = new EntityList <WpsProcessOffering>(context);

            var parameters = new NameValueCollection();

            parameters.Set("tag", "mytag");

            IOpenSearchResultCollection osr = ose.Query(services, parameters);

            Assert.AreEqual(1, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("tag", "tag");

            osr = ose.Query(services, parameters);
            Assert.AreEqual(0, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("tag", "tag,mytag");

            osr = ose.Query(services, parameters);
            Assert.AreEqual(0, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("tag", "mytag,mytag1");

            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            provider.Delete();
        }
예제 #14
0
        /// <summary>
        /// Gets the wps process offerings from URL.
        /// </summary>
        /// <returns>The wps process offerings from URL.</returns>
        /// <param name="baseurl">Baseurl.</param>
        /// <param name="updateProviderInfo">If set to <c>true</c> update provider info.</param>
        public new List <WpsProcessOffering> GetWpsProcessOfferingsFromRemote(bool updateProviderInfo = false, string username = null)
        {
            List <WpsProcessOffering> wpsProcessList = new List <WpsProcessOffering>();

            if (!IsWPS3())
            {
                return(base.GetWpsProcessOfferingsFromRemote(updateProviderInfo, username));
            }
            else
            {
                List <Process> wps3List   = new List <Process>();
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(this.BaseUrl);
                webRequest.Method = "GET";
                webRequest.Accept = "application/json";

                using (var httpResponse = (HttpWebResponse)webRequest.GetResponse()) {
                    using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) {
                        var result = streamReader.ReadToEnd();
                        wps3List = ServiceStack.Text.JsonSerializer.DeserializeFromString <List <Process> >(result);
                    }
                }

                if (wps3List != null)
                {
                    foreach (Process wps3 in wps3List)
                    {
                        WpsProcessOffering process = new WpsProcessOffering(context);
                        process.Identifier       = Guid.NewGuid().ToString();
                        process.RemoteIdentifier = wps3.Id;
                        process.Name             = wps3.Title;
                        process.Description      = wps3.Abstract ?? wps3.Title;
                        process.Version          = wps3.Version;
                        process.Url = new Uri(this.BaseUrl + "/" + wps3.Id).AbsoluteUri;
                        wpsProcessList.Add(process);
                    }
                }
            }

            return(wpsProcessList);
        }
예제 #15
0
        public void LoadWpsJobStatus()
        {
            WpsProvider provider = CreateProvider("planetek", "planetek", "http://urban-tep.planetek.it/wps/WebProcessingService", true);

            provider.Store();
            WpsProcessOffering process = CreateProcess(provider, "it.planetek.wps.extension.Processor", "Title of the processor");

            process.Store();
            WpsJob job = new WpsJob(context);

            job.WpsId          = process.Identifier;
            job.StatusLocation = "http://urban-tep.planetek.it/wps/RetrieveResultServlet?id=72ed982a-8522-4c02-bb71-77f4c22a7808";

            var jobresponse  = job.GetStatusLocationContent();
            var execResponse = jobresponse as ExecuteResponse;

            job.UpdateStatusFromExecuteResponse(execResponse);

            //get job recast response
            execResponse = ProductionResultHelper.GetWpsjobRecastResponse(context, job, execResponse);
            Assert.True(true);
        }
예제 #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Terradue.WebService.Model.WebService"/> class.
 /// </summary>
 /// <param name="entity">Entity.</param>
 public WebWpsService(WpsProcessOffering entity) : base(entity)
 {
     this.RemoteIdentifier = entity.RemoteIdentifier;
 }
예제 #17
0
        private void CreateWpsJobs()
        {
            WpsProcessOffering process = CreateProcess(false);
            var usr1    = User.FromUsername(context, "testusr1");
            var usr2    = User.FromUsername(context, "testusr2");
            var usr3    = User.FromUsername(context, "testusr3");
            var usr4    = User.FromUsername(context, "testusr4");
            var domain  = Domain.FromIdentifier(context, "myDomainTest");
            var domain2 = Domain.FromIdentifier(context, "otherDomainTest");

            //Create one wpsjob public for usr1 --- all should see it
            WpsJob job = CreateWpsJob("public-job-usr1", process, usr1);

            job.Store();
            job.GrantGlobalPermissions();

            //Create one wpsjob with domain where usr1 is member
            job        = CreateWpsJob("domain1-job-usr2", process, usr2);
            job.Domain = domain;
            job.Store();

            //Create one wpsjob with domain where usr1 is not member
            job        = CreateWpsJob("domain2-job-usr3", process, usr3);
            job.Domain = domain2;
            job.Store();

            //Create one wpsjob public for usr2 --- all should see it
            job = CreateWpsJob("public-job-usr2", process, usr2);
            job.Store();
            job.GrantGlobalPermissions();

            //Create one wpsjob restricted for usr1
            job = CreateWpsJob("restricted-job-usr1-2", process, usr1);
            job.Store();
            job.GrantPermissionsToUsers(new int[] { usr2.Id });

            //Create one wpsjob restricted for usr2
            job = CreateWpsJob("restricted-job-usr2-1", process, usr2);
            job.Store();
            job.GrantPermissionsToUsers(new int[] { usr1.Id });

            //Create one wpsjob restricted for usr2
            job = CreateWpsJob("restricted-job-usr2-3", process, usr2);
            job.Store();
            job.GrantPermissionsToUsers(new int[] { usr3.Id });

            //Create one wpsjob private for usr1
            job = CreateWpsJob("private-job-usr1", process, usr1);
            job.Store();

            //Create one wpsjob private for usr2
            job = CreateWpsJob("private-job-usr2", process, usr2);
            job.Store();

            //Create one wpsjob private for usr3
            job = CreateWpsJob("private-job-usr3", process, usr3);
            job.Store();

            //Create one wpsjob private for usr4
            job = CreateWpsJob("private-job-usr4", process, usr4);
            job.Store();
        }
예제 #18
0
        /// <summary>
        /// Get list of Processing Services from Atom Feed
        /// Each Item of the feed contains a Describe Process url
        /// </summary>
        /// <param name="context"></param>
        /// <param name="feed"></param>
        /// <param name="createProviderIfNotFound"></param>
        /// <returns></returns>
        public static List <WpsProcessOffering> GetRemoteWpsProcessingOfferingsFromUrl(IfyContext context, string url, bool createProviderIfNotFound)
        {
            var remoteProcesses = new List <WpsProcessOffering>();

            var items = GetRemoteWpsServiceEntriesFromUrl(context, url);

            foreach (OwsContextAtomEntry item in items)
            {
                var wps = GetWpsProcessOfferingFromProcessDescriptionAtomFeed(context, item);
                if (wps == null)
                {
                    continue;
                }

                var         describeProcessUrl = wps.Url;
                var         providerBaseUrl    = describeProcessUrl.Substring(0, describeProcessUrl.LastIndexOf("/"));
                var         processIdentifier  = describeProcessUrl.Substring(describeProcessUrl.LastIndexOf("/") + 1);
                WpsProvider wpsprovider        = null;
                try {
                    wpsprovider = WpsProvider.FromBaseUrl(context, providerBaseUrl);
                } catch (System.Exception) {
                    if (createProviderIfNotFound)
                    {
                        var urip = new Uri(providerBaseUrl);
                        wpsprovider            = new WpsProvider(context);
                        wpsprovider.Identifier = urip.AbsolutePath.Contains("/wps3/processes") ?
                                                 urip.Host + urip.AbsolutePath.Substring(0, urip.AbsolutePath.IndexOf("/wps3/processes")).Replace("/", ".") :
                                                 Guid.NewGuid().ToString();
                        wpsprovider.Name = urip.AbsolutePath.Contains("/wps3/processes") ?
                                           urip.Host + urip.AbsolutePath.Substring(0, urip.AbsolutePath.IndexOf("/wps3/processes")).Replace("/", ".") :
                                           urip.Host + urip.AbsolutePath.Replace("/", ".");
                        wpsprovider.BaseUrl      = providerBaseUrl;
                        wpsprovider.StageResults = true;
                        wpsprovider.Proxy        = true;
                        wpsprovider.Store();

                        wpsprovider.GrantPermissionsToAll();
                    }
                }
                if (wpsprovider != null)
                {
                    wps.Provider = wpsprovider;
                }

                //case WPS 3.0
                if (IsWPS3(describeProcessUrl))
                {
                    try
                    {
                        WpsProcessOffering process = GetProcessingFromDescribeProcessWps3(context, describeProcessUrl);
                        wps.RemoteIdentifier = process.RemoteIdentifier;
                        if (string.IsNullOrEmpty(wps.Name))
                        {
                            wps.Name = process.Name;
                        }
                        if (string.IsNullOrEmpty(wps.Description))
                        {
                            wps.Description = process.Description;
                        }
                        if (string.IsNullOrEmpty(wps.Version))
                        {
                            wps.Version = process.Version;
                        }
                    }catch (System.Exception e) {
                        context.LogError(context, "Error with url '" + describeProcessUrl + "' : " + e.Message);
                        wps = null;
                    }
                }
                if (wps == null)
                {
                    continue;
                }
                remoteProcesses.Add(wps);
            }
            return(remoteProcesses);
        }
예제 #19
0
        public void SearchWpsServicesByAvailability()
        {
            var         uid      = Guid.NewGuid().ToString();
            WpsProvider provider = CreateProvider(uid, "test provider", "http://gpod.eo.esa.int/wps?service=WPS&version=1.0.0&request=GetCapabilities", false);

            provider.UpdateProcessOfferings();

            EntityList <WpsProcessOffering> wpsProcessList = new EntityList <WpsProcessOffering>(context);

            wpsProcessList.Template.Provider = provider;
            wpsProcessList.Load();

            var nbprocesses = wpsProcessList.Items.Count();

            EntityList <WpsProcessOffering> services = new EntityList <WpsProcessOffering>(context);

            var parameters = new NameValueCollection();

            parameters.Set("count", (nbprocesses + 1) + "");

            IOpenSearchResultCollection osr = ose.Query(services, parameters);

            Assert.AreEqual(nbprocesses, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "all");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(nbprocesses, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "false");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(nbprocesses, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "true");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(0, osr.Items.Count());

            WpsProcessOffering service1 = wpsProcessList.Items.First();

            service1.Available = true;
            service1.Store();

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "all");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(nbprocesses, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "false");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(nbprocesses - 1, osr.Items.Count());

            services = new EntityList <WpsProcessOffering>(context);
            parameters.Set("available", "true");
            osr = ose.Query(services, parameters);
            Assert.AreEqual(1, osr.Items.Count());

            provider.Delete();
        }
예제 #20
0
        public object Put(BulkSwitchServiceRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.AdminOnly);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/service/wps/bulk/replace PUT identifiers='{0}' newIdentifier='{1}'", string.Join(",", request.Identifiers), request.Service != null ? request.Service.Identifier : null));

                if (request.Identifiers == null || request.Identifiers.Count == 0)
                {
                    return(new HttpResult("No services specified", HttpStatusCode.BadRequest));
                }
                if (request.Service == null)
                {
                    return(new HttpResult("No service specified", HttpStatusCode.BadRequest));
                }

                foreach (var identifier in request.Identifiers)
                {
                    try
                    {
                        WpsProcessOfferingTep wpsOld = WpsProcessOfferingTep.FromIdentifier(context, identifier);
                        WpsProcessOffering    wpsNew = (WpsProcessOffering)request.Service.ToEntity(context, new WpsProcessOffering(context));
                        wpsNew.Identifier = Guid.NewGuid().ToString();

                        if (!string.IsNullOrEmpty(request.WpsIdentifier))
                        {
                            var provider = (WpsProvider)ComputingResource.FromIdentifier(context, request.WpsIdentifier);
                            wpsNew.Provider = provider;
                        }
                        else
                        {
                            wpsNew.Provider = wpsOld.Provider;
                        }
                        wpsNew.DomainId            = wpsOld.DomainId;
                        wpsNew.Tags                = wpsOld.Tags;
                        wpsNew.IconUrl             = wpsOld.IconUrl;
                        wpsNew.Available           = true;
                        wpsNew.Commercial          = wpsOld.Commercial;
                        wpsNew.Geometry            = wpsOld.Geometry;
                        wpsNew.ValidationUrl       = wpsOld.ValidationUrl;
                        wpsNew.TermsConditionsUrl  = wpsOld.TermsConditionsUrl;
                        wpsNew.TermsConditionsText = wpsOld.TermsConditionsText;
                        wpsNew.Store();

                        if (request.DeleteOld)
                        {
                            wpsOld.Delete();
                        }
                        else
                        {
                            wpsOld.Available = false;
                            wpsOld.Store();
                        }
                    }
                    catch (Exception e)
                    {
                        context.LogError(this, "Error while loading service " + identifier, e);
                    }
                }

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new HttpResult("", HttpStatusCode.OK));
        }