2012-08-09 38 views
0

我想複製使用.NET類(httpWebRequest)而不是捲曲的數據庫。不幸的是,cURL的工作,但在.NET中(可能)相同的語法失敗,404「未經授權訪問或創建數據庫」的錯誤。以下是我的代碼。Couchdb複製 - 擅自創建或訪問數據庫

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("sourceURL"); 
     request.Method = "POST"; 
     request.ContentType = "application/json"; 

     long ticks = DateTime.UtcNow.Ticks; 

     string json = "{ \"_id\":\"database_replicate" + ticks + "\", \"source\":\"sourceURL/database\", \"target\":\"database\", \"create_target\":true, \"user_ctx\": { \"roles\": [\"_admin\"] } }"; 

     using (var writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write(json); 
      writer.Close(); 
     } 

然後,就在這裏失敗了,對響應:

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

我複製到和從本地主機。我試過使用request.Credentials傳遞憑據,但這並沒有改變這個問題。也不在URL中傳遞憑證。

回答

1

事實證明,問題是我的用戶名和密碼沒有被捕獲。無論我是否嘗試將它們作爲網址的一部分傳遞給它們,還是作爲憑據屬性,它都沒有選擇它們。我必須創建一個這樣的授權標頭

$authorization = [System.Convert]::ToBase64String([System.Text.ASCIIEncoding]::ASCII.GetBytes("username" + ":" + "password")) 
$delRequest.Headers.Add("Authorization", "authType " + $authorization) 

使其工作。

3

當你的代碼編寫,JSON字符串會是這樣的:

{ 
    "_id":"database_replicate634805792932046092", 
    "source":"sourceURL/database", 
    "target":"database", 
    "create_target":true, 
    "user_ctx": { 
     "roles": ["_admin"] 
    } 
} 

當你使用捲曲,你送?

+0

感謝您的評論。事實證明,這並沒有抓住我的認證 - 這是掛斷。所以我明確地創建了一個Authorize頭,它工作。在cURL中,我在URL中發送了用戶名和密碼,但我必須在.NET中明確地執行它。 – Skitterm 2012-08-15 16:54:21

+3

我一直在爲一個相關的問題奮鬥了3天。原來,user_ctx參數是我所需要的。謝謝! – 2013-07-25 09:19:39

+1

我也被卡在'user_ctx'參數上。對於任何對它做什麼以及爲什麼需要它感到好奇的人,請查看[文檔中的細微處](http://docs.couchdb.org/en/1.6.1/replication/replicator.html#delegations) – 2016-03-06 22:09:57