Thursday 5 January 2017

HTTP 500 error when uploading shapefile to GeoServer with C#


I receive an HTTP 500 internal server error when attempting to PUT a shapefile using REST API. I can manually import the file, publish and preview it. So the file is fine.


GeoServer log:


2016-05-24 12:20:25,921 INFO [catalog.rest] - PUT file, mimetype: application/zip
2016-05-24 12:20:27,140 INFO [catalog.rest] - Auto-configuring datastore: testshapes
2016-05-24 12:20:27,140 ERROR [geoserver.rest] -

java.lang.NullPointerException
at org.geoserver.catalog.rest.DataStoreFileResource.updateParameters(DataStoreFileResource.java:515)
at org.geoserver.catalog.rest.DataStoreFileResource.handlePut(DataStoreFileResource.java:271)
at org.restlet.Finder.handle(Finder.java:298)
at org.geoserver.rest.BeanDelegatingRestlet.handle(BeanDelegatingRestlet.java:38)
at org.restlet.Filter.doHandle(Filter.java:105)
at org.restlet.Filter.handle(Filter.java:134)
at org.restlet.Router.handle(Router.java:444)

Fiddler RAW view of request and response:



PUT http://localhost:8080/geoserver/rest/workspaces/test/datastores/testshapes/file.shp HTTP/1.1
Content-Type: application/zip
Authorization: Basic YWRtaW46Z2Vvc2VydmVy
Host: localhost:8080
Content-Length: 205898
Expect: 100-continue
Connection: Keep-Alive


HTTP/1.1 500 Internal Server Error

Transfer-Encoding: chunked
Server: Jetty(6.1.8)

0

C# code:


public bool UploadShapeFile(string workspace, string newStoreName, byte[] fileContents)
{
byte[] localShapeFile = fileContents;
String sUrl = GEOSERVER_HOST + "workspaces/" + workspace + "/datastores/" + newStoreName + "/file.shp";

WebRequest request = WebRequest.Create(sUrl);
request.ContentType = "application/zip";
request.Method = "PUT";
request.Credentials = new NetworkCredential(GEOSERVER_USER, GEOSERVER_PASSWD);

request.Headers.Add("Authorization", "Basic " +
Convert.ToBase64String(Encoding.ASCII.GetBytes(GEOSERVER_USER + ":" + GEOSERVER_PASSWD)));

Stream requestStream = request.GetRequestStream();
requestStream.Write(localShapeFile, 0, localShapeFile.Length);

requestStream.Close();

WebResponse response = request.GetResponse();
return false;
}

Usage:


var c = new GeoServerClient.Endpoint(); 
var f =
System.IO.File.ReadAllBytes(@"C:\path\to\file\1-2-2015-34-municipal-shp.zip");

c.UploadShapeFile("test", "testshapes", f);

Answer



I had the same issue, and it was resolved after setting the "Activate HTTP method matching", and checking PUT method.


Access your geoserver web interface ( http://localhost:8070/geoserver/web ), ans then: Authentication --> Filter Chains --> rest --> Check HTTP Method (check), PUT (check) --> hit 'close' and then 'save'


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...