Próbuję przesłać niektóre obrazy + niektóre dane meta do serwera przez post HTTP z aplikacji sklepu Windows, ale utknąłem, próbując faktycznie uwzględnić dane w poście. Nie można tego zrobić w taki sposób, w jaki można to osiągnąć w aplikacji formularzy systemu Windows lub podobnych ze względu na zmiany w interfejsie API aplikacji sklepu.Wysyłaj tablicę bajtów przez HTTP POST w aplikacji sklepu
Dostaję błąd.
cannot convert source type byte[] to target type System.Net.Http.httpContent
teraz jest to oczywiście, bo to 2 różne typy, które nie mogą być niejawnie rzutować, ale to w zasadzie to, czego szukam, aby móc to zrobić. Jak zrobić aby moje dane tablicy bajtów Into the httpContent wpisać więc mogę umieścić go w następnym wywołaniu
httpClient.PostAsync(Uri uri,HttpContent content);
oto moja metoda pełna Dodano:
async private Task UploadPhotos(List<Photo> photoCollection, string recipient, string format)
{
PhotoDataGroupDTO photoGroupDTO = PhotoSessionMapper.Map(photoCollection);
try
{
var client = new HttpClient();
client.MaxResponseContentBufferSize = 256000;
client.DefaultRequestHeaders.Add("Upload", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
// POST action_begin
const string actionBeginUri = "http://localhost:51139/PhotoService.axd?action=Begin";
HttpResponseMessage response = await client.GetAsync(actionBeginUri);
response.EnsureSuccessStatusCode();
string responseBodyAsText = await response.Content.ReadAsStringAsync();
string id = responseBodyAsText;
////
// POST action_upload
Uri actionUploadUri = new Uri("http://localhost:51139/PhotoService.axd?action=Upload&brand={0}&id={1}&name={2}.jpg");
var metaData = new Dictionary<string, string>()
{
{"Id", id},
{"Brand", "M3rror"}, //TODO: Denne tekst skal komme fra en konfigurationsfil.
{"Format", format},
{"Recipient", recipient}
};
string stringData = "";
foreach (string key in metaData.Keys)
{
string value;
metaData.TryGetValue(key, out value);
stringData += key + "=" + value + ",";
}
UTF8Encoding encoding = new UTF8Encoding();
byte[] byteData = encoding.GetBytes(stringData);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, actionUploadUri);
// send meta data
// TODO get byte data in as content
HttpContent metaDataContent = byteData;
HttpResponseMessage actionUploadResponse = await client.PostAsync(actionUploadUri, metaDataContent);
actionUploadResponse.EnsureSuccessStatusCode();
responseBodyAsText = await actionUploadResponse.Content.ReadAsStringAsync();
// send photos
// TODO get byte data in as content
foreach (byte[] imageData in photoGroupDTO.PhotosData)
{
HttpContent imageContent = imageData;
actionUploadResponse = await client.PostAsync(actionUploadUri, imageContent);
actionUploadResponse.EnsureSuccessStatusCode();
responseBodyAsText = await actionUploadResponse.Content.ReadAsStringAsync();
}
////
// POST action_complete
const string actionCompleteUri = "http://localhost:51139/PhotoService.axd?action=Complete";
HttpResponseMessage actionCompleteResponse = await client.GetAsync(actionCompleteUri);
actionCompleteResponse.EnsureSuccessStatusCode();
responseBodyAsText = await actionCompleteResponse.Content.ReadAsStringAsync();
////
}
catch (HttpRequestException e)
{
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
}
robi czy dane binarne muszą być * serializowane *? Również prawdopodobnie chcesz * przesłać * zamiast przesyłać je wszystkie naraz. http://stackoverflow.com/questions/19005991/webapi-how-to-handle-images może pomóc. – bytefire