cURL с аутентификацией пользователя в C # - PullRequest
11 голосов
/ 01 марта 2011

Я хочу выполнить следующий запрос cURL в c #:

curl -u admin:geoserver -v -XPOST -H 'Content-type: text/xml' \
   -d '<workspace><name>acme</name></workspace>' \
   http://localhost:8080/geoserver/rest/workspaces

Я пытался использовать веб-запрос:

string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);

request.ContentType = "Content-type: text/xml";
request.Method = "POST";
request.Credentials = new NetworkCredential("admin", "geoserver");

byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();

WebResponse response = request.GetResponse();
...

Но я получаю ошибку: (400) Неверный запрос.

Если я изменю учетные данные запроса и добавлю аутентификацию в заголовок:

string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);

request.ContentType = "Content-type: text/xml";
request.Method = "POST";
string authInfo = "admin:geoserver";
request.Headers["Authorization"] = "Basic " + authInfo;

byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();

WebResponse response = request.GetResponse();
...

Тогда я получу: (401) Несанкционированный.

Мой вопрос: долженЯ использую другой класс C #, например, WebClient или HttpWebRequest, или мне нужно использовать привязки скручивания для .NET?

Будем благодарны за любые комментарии или рекомендации.

Ответы [ 3 ]

12 голосов
/ 01 марта 2011

Проверка подлинности HTTP Basic требует, чтобы все после "Basic" было закодировано в Base64, поэтому попробуйте

request.Headers["Authorization"] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));
9 голосов
/ 02 марта 2011

Решением моего вопроса было изменение свойства ContentType .Если я изменю ContentType на

request.ContentType = "text/xml";

, запрос будет работать в обоих случаях, если я также преобразую authInfo в Base64String в последнем примере, например Антон Гоголев предлагается.

2 голосов
/ 21 июня 2012

Использование:

request.ContentType = "application/xml";

request.Credentials = new NetworkCredential(GEOSERVER_USER, GEOSERVER_PASSWD);

также работает.Вторая устанавливает информацию для аутентификации.

...