0

curl コマンドラインの代わりに .NET クラスを使用して Couch データベースを複製しようとしています。以前に WebRequest または Httpwebrequest を使用したことはありませんが、これらを使用して、以下のスクリプトでポスト リクエストを作成しようとしています。

これはcouchdbレプリケーション用のJSONスクリプトです(私はこれが機能することを知っています):

{ ""_id"":"database_replicate8/7/12", "source":sourcedb, ""target"":"targetDB", ""create_target"":true, ""user_ctx"": { ""roles"": ["myrole"] } }

上記のスクリプトは、テキスト ファイル sourcefile.txt に入れられます。この行を取得し、.NET 機能を使用して POST Web 要求に入れたいと思います。

調べた結果、httpwebrequest クラスを使用することにしました。以下は私がこれまでに持っているものです - http://msdn.microsoft.com/en-us/library/debx8sh9.aspxからこれを入手しました

 HttpWebRequest bob = (HttpWebRequest)WebRequest.Create("sourceDBURL");
 bob.Method = "POST";
 bob.ContentType = "application/json";
 byte[] bytearray = File.ReadAllBytes(@"sourcefile.txt");
 Stream datastream = bob.GetRequestStream();
 datastream.Write(bytearray, 0, bytearray.Length);
 datastream.Close();

私はこれについて正しく行っていますか?私は Web テクノロジに比較的慣れておらず、http 呼び出しのしくみをまだ学んでいます。

4

1 に答える 1

0

POSTリクエストを作成するために私が使用する方法は次のとおりです。

 private static HttpWebRequest createNewPostRequest(string apikey, string secretkey, string endpoint)
 {
    HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
    request.Proxy = null;
    request.Method = "POST";
    //Specify the xml/Json content types that are acceptable. 
    request.ContentType = "application/xml";
    request.Accept = "application/xml";

    //Attach authorization information
    request.Headers.Add("Authorization", apikey);
    request.Headers.Add("Secretkey", secretkey);
    return request;
 }

メイン メソッド内では、次のように呼び出します。

HttpWebRequest request = createNewPostRequest(apikey, secretkey, endpoint);

次に、データを次のようにメソッドに渡します。

string requestBody = SerializeToString(requestObj);

byte[] byteStr = Encoding.UTF8.GetBytes(requestBody);
request.ContentLength = byteStr.Length;

using (Stream stream = request.GetRequestStream())
{
    stream.Write(byteStr, 0, byteStr.Length);
}

//Parse the response
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    //Business error
    if (response.StatusCode != HttpStatusCode.OK)
    {
        Console.WriteLine(string.Format("Error: response status code is{0}, at time:{1}", response.StatusCode, DateTime.Now.ToString()));

        return "error";
    }
    else if (response.StatusCode == HttpStatusCode.OK)//Success
    {
        using (Stream respStream = response.GetResponseStream())
        {
            XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
            reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
        }

     }
...

私の場合、クラスから体をシリアル化/逆シリアル化します。テキスト ファイルを使用するには、これを変更する必要があります。ソリューションを簡単にドロップしたい場合は、SerializetoStringメソッドを、テキスト ファイルを文字列にロードするメソッドに変更します。

于 2012-08-07T18:21:08.850 に答える