5

I'm slighlty confused with the changes at 10.1 and understand this version no longer supports DCOM or remote arcobjects.

Can you use ArcObjects in a webservice (in my case a .NET MVC 4 service) that is deployed on the ArcGIS Server host (so not remote) and uses ArcObjects to perform editing on a gdb featureclass?

Or is the only way to go through the SOE framework?

If you can use ArcObjects in the .NET MVC service are there any ramifications of doing so over using an SOE?

1

1 Answer 1

3

you can use arcobjects in an MVC service (or any service for that matter) as long as the service(s) reside on the same server as ArcGIS Server. Use ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Server)) and ... serverStatus = ao.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcServer);

public HttpResponseMessage Post([FromBody] List<ModelRequest> requests)
    {
        //request not getting through
        //verify TrowIfMaxHttpCollectionKeysExceeded
        //limits the amount of collections sent (default 1000) overide with below.
        //<appSettings>
        //<add key="aspnet:MaxHttpCollectionKeys" value="1001" />
        //</appSettings>
        if (requests == null)
        {
            return CreateResponseMessage(HttpStatusCode.InternalServerError, "Unhandled Exception", "Request Is Null");
        }

        HttpResponseMessage returnMessage = CreateResponseMessage(HttpStatusCode.InternalServerError, "Unhandled Exception", "Task Failed"); ;

        var sta = new StaTaskScheduler(numberOfThreads: 1);
        var task = Task.Factory.StartNew(() =>
        {
            //do work in sta thread
            returnMessage = DoWork(requests);
        }, CancellationToken.None, TaskCreationOptions.None, sta);

        Task.WaitAll(task);

        return returnMessage;

    }

    private HttpResponseMessage DoWork(List<ModelRequest> requests)
    {
        //now in StaThread
        string staVerify = Thread.CurrentThread.GetApartmentState().ToString();

        //Do ArcObjects coding here... make sure ALL arcobjects are created in the
        //StaThread. Watch out for member level variables that are created in static
        //classes for example.

        return Request.CreateResponse(HttpStatusCode.OK, myModelResults, "application/json");
    }

    /// <summary>
    /// Create an HTTP custom response.
    /// </summary>
    /// <param name="code">HTTP Status Code</param>
    /// <param name="title">title of response message.</param>
    /// <param name="content">response message content.</param>
    /// <returns>HttpResponseMessage</returns>
    private HttpResponseMessage CreateResponseMessage(HttpStatusCode code, string title, string content)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(content),
            ReasonPhrase = title
        };

        return resp;
    }
6
  • Don't you need to do something to make it run on an STAThread? Commented Feb 28, 2013 at 23:41
  • Seems like something like this would be needed to assure it's on an STAThread. Commented Mar 1, 2013 at 3:06
  • 1
    I am using the STATaskScheduler and seems to work like a charm. Commented Apr 23, 2013 at 14:48
  • The STATaskScheduler looks very useful ... could you post code snippet showing how you're using it? At least mention it in your answer. Google will find it there - but not in the comments section (or so I'm told). Googling for STATaskScheduler and Arcobjects only turns up this. Commented Apr 23, 2013 at 14:58
  • Code below. not sure if I added it right so it's picked up by Google. it's not very complex as you can see. Actually the ThrowIfMaxHttpCollectionKeysExceeded was a bigger pain but left that in too. Commented Apr 23, 2013 at 23:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.