5

サードパーティのサービスと通信するために JavaScript を使用しています。認証プロセスの一環として、md5 で暗号化される画像を含む投稿メッセージの「マルチパート/フォーム」本文が必要です。これは、日付を含む文字列に追加され、その他いくつかの要素が追加され、HMAc/SHA1 が実行されます。その上で。したがって、最終的には、認証してから画像を読み取るために、マルチパートボディ、日付、および認証ハッシュがあります。

これは、windowsPhone を除くすべてのモバイル デバイスで正常に機能します (IE の問題であることはわかっています... 誰が考えたでしょうか?)。彼らの httpwebrequest には「Date」ヘッダーが含まれていないため、認証はありません。これは、Windows phone のネイティブに移行し、新しくリリースされた httpclient コードを C# で使用する必要があることを意味します。今、私はC#初心者なので、これがおそらく簡単な解決策です。ほとんどすべてをC#に渡し、C#を使用して投稿するだけで認証が機能するようになりましたが、境界を送信するために私が見つけた唯一の方法は、コンテンツをmultipartformDatacontentとして定義し、そのコンテンツを送信するときであるため、本文を読み取ることができません方法は本文を変更するため、認証は失敗します。

私のjavascriptは次のようなものです:

var boundary = "------------ThIs_Is_tHe_bouNdaRY_";
var part1Array = [];
var part1 = "--"+boundary + "\r\n"+
    "Content-Disposition: form-data; name=\"image\"\r\n"+
    "Content-Type: image/jpg\r\n"+
    "\r\n";
var part3Array = [];
var part3 = "\r\n" + boundary +"--";
for(var p1=0; p1<part1.length; p1++){
    part1Array.push(part1.charCodeAt(p1));
}
for(var p3=0; p3<part3.length; p3++){
    part3Array.push(part3.charCodeAt(p3));
}
var bodyContent = part1Array.concat(imageArray,part3Array);

//hash this

var authMessage = bodyContentHash +"\n"+ contentType +"\n"+ todayString +"\n"+ pathandstuff;
// -hmac -sha1 -base64

c# は次のとおりです。

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, path);

request.Headers.Date = DateTime.ParseExact(todaydate, "ddd',' dd MMM yyyy HH:mm:ss 'GMT'", new CultureInfo("en-US"), DateTimeStyles.AssumeUniversal);
request.Headers.Add("Accept", "application/json; charset=utf-8");
request.Headers.Add("Authorization", auth);

byte[] body = Convert.FromBase64String(bodyData);
request.Content = new ByteArrayContent(body);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
request.Content.Headers.Add("boundary", "------------ThIs_Is_tHe_bouNdaRY_");

HttpResponseMessage response = client.SendAsync(request).Result;
string resultCode = response.StatusCode.ToString();
string responseBodyAsText = await response.Content.ReadAsStringAsync();

これはほとんど機能します..本文のコンテンツはヘッダーと同様に正しいです..次のようにする必要があるコンテンツタイプヘッダーを除くすべて:

request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data, boundary=------------ThIs_Is_tHe_bouNdaRY_");

これが System.FormatException エラーをスローすることを除いて。

4

3 に答える 3

12

MediaTypeHeaderValue() クラスは境界タグを好まないようです。

を使用する代わりに:

content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data; boundary=----FLICKR_MIME_20140415120129--");

私たちは次のことを行いました:

content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=----FLICKR_MIME_20140415120129--");

この変更を行うと、すべて正しく機能しました。

(違いがある場合、これは WinRT 上にあることに注意してください)

于 2014-04-15T01:02:48.540 に答える
5

HttpClient で

 request.Content.Headers.Add("ContentType", "multipart/form-data, boundary=------------ThIs_Is_tHe_bouNdaRY_");

HttpWebRequest を使用できます

 myHttpWebRequest.Date = DateTime.Now;
 myHttpWebRequest.ContentType = "multipart/form-data, boundary=------------ThIs_Is_tHe_bouNdaRY_";
于 2013-08-29T00:18:19.253 に答える