Доступ к облачной базе данных с помощью .Net HttpClient

Я пытаюсь подключиться к Cloudant (база данных в стиле дивана) из приложения .Net MVC. Я следую рекомендациям по использованию веб-API с помощью HttpClient, как показано здесь: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

Пока у меня есть два метода — один для получения документа и один для создания документа — и оба имеют ошибки. Метод Get возвращает Unauthorized, а метод Post возвращает MethodNotAllowed.

Клиент создается так:

    private HttpClient CreateLdstnCouchClient()
    {
        // TODO: Consider using WebRequestHandler to set properties


        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(_couchUrl);

        // Accept JSON
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));


        return client;
    }

Метод Get:

    public override string GetDocumentJson(string id)
    {
        string url = "/" + id;

        HttpResponseMessage response = new HttpResponseMessage();
        string strContent = "";

        using (var client = CreateLdstnCouchClient())
        {
            response = client.GetAsync(url).Result;

            if (response.IsSuccessStatusCode)
            {
                strContent = response.Content.ReadAsStringAsync().Result;
            }
            else
            {
                // DEBUG
                strContent = response.StatusCode.ToString();
                LslTrace.Write("Failed to get data from couch");
            }
        }

        return strContent;
    }

Почтовый метод:

    public override string CreateDocument(object serializableObject)
    {
        string url = CouchApi.CREATE_DOCUMENT_POST;

        HttpResponseMessage response = new HttpResponseMessage();

        string strContent = "";

        using (var client = CreateLdstnCouchClient())
        {

            response = client.PostAsJsonAsync(url, serializableObject).Result;
            strContent = response.Content.ReadAsStringAsync().Result;
        }

        if (response.IsSuccessStatusCode)
        {
            return strContent;
        }
        else
        {
            LslTrace.Write("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            return response.StatusCode.ToString();
        }
    }

URL-адреса соответствуют документации API: https://username:[email protected].

Я очень смущен тем, что происходит, и у меня много проблем с поиском примеров. Спасибо за вашу помощь!

Томас


person user2472891    schedule 11.06.2013    source источник


Ответы (1)


С помощью HttpClient вам необходимо сделать следующее для правильной аутентификации (при условии, что вы используете базовую аутентификацию):

HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(_userName, _password);
HttpClient client = new HttpClient(handler) {
    BaseAddress = new Uri(_couchUrl)
};

Вы не должны указывать имя пользователя/пароль в _couchUrl - HttpClient не поддерживает это.

Я не вижу вашей реализации PostAsJsonAsync или полного URL-адреса, который вы создаете, но вы можете попробовать проверить / зарегистрировать response.ReasonPhrase при возникновении ошибки, чтобы получить подсказку о том, что пошло не так.

person Will Holley    schedule 11.06.2013
comment
Я опубликовал очень простой пример, показывающий, как вызывать Cloudant API из С#, посмотрите github.com/cloudant/haengematte/blob/master/c%23/dotNet-45/ - person Will Holley; 11.06.2013
comment
Я также предлагаю взглянуть на одну из оболочек CouchDB API для .NET. Лично мне нравится MyCouch, но LoveSeat и Divan также являются хорошими вариантами. - person Will Holley; 11.06.2013