0

マルチパート コンテンツ タイプを使用して一括インポートを実行しようとしていますが、何を試してもエラー 400 - Bad Request が継続的に発生します。残念ながら、これはあまりわかりません。連絡先の一括インポートに関するドキュメントには、連絡先の検証中にエラーが発生した場合にこのエラーが発生するとしか記載されていません。これは私が現在導入している方法です:

public void SendContactFile(string contactListId, FileInfo listFile)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        using (var content = new MultipartFormDataContent())
        {
            var contentPieces = new []
            {
                new KeyValuePair<string, string>("file_name", listFile.Name),
                new KeyValuePair<string, string>("lists", contactListId), 
            };
            //var data = new StreamContent(listFile.OpenRead()); //I've tried using both StreamContent and ByteArrayContent; both returned the same failure.
            var data = new ByteArrayContent(File.ReadAllBytes(listFile.FullName));
            data.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = listFile.Name
            };//I've tried with & without this header.

            foreach (KeyValuePair<string, string> pair in contentPieces)
            {
                content.Add(new StringContent(pair.Value), pair.Key);
            }
            content.Add(data);

            var result = client.PostAsync(FullApiAddress, content).Result;
            Console.WriteLine("Status Code: {0} - {1}, Request Message: {3}", 
                result.StatusCode, 
                result.ReasonPhrase,
                result.RequestMessage);
        }
    }
}

最後に、私の Console.WriteLine() によって表示される情報は次のとおりです。

Status Code: BadRequest - Bad Request, 
Request Message: Method: POST, 
RequestUri: 'https://api.constantcontact.com/v2/activities/addcontacts?api_key=My_API_Key',
Content: System.Net.Http.MultipartFormDataContent, 
Headers:
{
  Authorization: Bearer My-Access-Token
  Accept: application/json
  Content-Type: multipart/form-data; boundary="ead4e036-5921-4a98-847b-12h4sgre4
69c"
  Content-Length: 556
}

編集

以下のコメントにある Amy の提案のおかげで、Chrome の Postman 拡張機能を使用して、ブラウザーから直接一括インポートを実行しました。そうすることで、エラーの考えられる原因としてファイルのフォーマットを除外することができ (そしてそれらの例を削除しました)、正しい方法でこれを行っていることもわかります。したがって、私のコードでは何かが正しくありません...誰かからのアイデアはありますか?

成功したブラウザー内リクエストと上記のヘッダーの違いの 1 つはContent-Type: mulitpart/form-data;、ブラウザーからの情報には各部分に境界情報が含まれているのに対して、ヘッダーには境界情報が含まれていることです。また、上記のコードは各部分を示していません。Postman リクエストのプレビューの例:

Content-Type: multipart/form-data
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file_name"

ContactList.txt
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="lists"
4

1 に答える 1

1

この過程でかけがえのない助けをしてくれた Amy に感謝します。

これらの行を除いて、上で使用したほとんどのコードに必ずしも問題がないことがわかりました。

data.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = listFile.Name
};//I've tried with & without this header.

これは私が質問した時点で実験していたことであり、リクエストを破っています。私の主な問題は、アップロードしていた 3 つの部分の Content-Disposition ヘッダーを作成するときに、C# が name 値の周りに引用符を追加しないことであることが判明しました。これにより、400 - Bad Request エラーが返されました。作業コードは次のようになります。

using (var content = new MultipartFormDataContent())
{
    var fileNameContent = new StringContent(listFile.Name);
    content.Add(fileNameContent, "\"file_name\"");

    var listContent = new StringContent(contactListId);
    content.Add(listContent, "\"lists\"");

    var dataContent = new ByteArrayContent(File.ReadAllBytes(listFile.FullName));
    content.Add(dataContent, "\"data\"");

    result = client.PostAsync(FullApiAddress, content).Result;
}

各名前の値が二重引用符で囲まれていることに注意してください。リクエストを機能させるために必要だったのは、この単純な変更だけでした。これが将来誰にとっても役立つことを願っています。

于 2015-03-27T20:48:16.343 に答える