3

.Net MVC アプリケーションから Cloudant (ソファ スタイルの DB) に接続しようとしています。ここに示すように、HttpClient を使用して Web API を使用するためのガイドラインに従っています: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-ネットクライアント

これまでのところ、ドキュメントを取得する方法とドキュメントを作成する方法の 2 つの方法がありますが、どちらにもエラーがあります。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;
    }

Post メソッドは次のとおりです。

    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:password@username.cloudant.com

私は何が起こっているのか非常に混乱しており、例を見つけるのに苦労しています. ご協力いただきありがとうございます!

トーマス

4

1 に答える 1

7

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 を調べたりログに記録したりして、問題のヒントを得ることができます。

于 2013-06-11T09:47:47.833 に答える