マルチパート コンテンツ タイプを使用して一括インポートを実行しようとしていますが、何を試してもエラー 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"