Существует способ загрузить файл и получить ответ сервера, используя WebClient
в Silverlight
.
Внутренне UploadStringAsync
преобразует строку в байты с помощью своей кодировки:
byte[] bytes = this.Encoding.GetBytes(data);
Итак, я написал простую оболочку кодирования base64 (в моем сценарии реализованы только фактически используемые методы):
public class WebClientUploaderBase64Encoding : System.Text.Encoding
{
public override int GetMaxCharCount(int byteCount) {throw new NotImplementedException();}
public override int GetMaxByteCount(int charCount){throw new NotImplementedException();}
public override int GetCharCount(byte[] bytes, int index, int count){throw new NotImplementedException();}
public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex){throw new NotImplementedException();}
public override int GetByteCount(char[] chars, int index, int count)
{
var data = System.Convert.FromBase64CharArray(chars, index, count);
return data.Length;
}
public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
{
var data = System.Convert.FromBase64CharArray(chars, charIndex, charCount);
for (int index = 0; index < data.Length; ++index)
bytes[byteIndex + index] = data[index];
return data.Length;
}
public override string GetString(byte[] bytes, int start, int length)
{
return System.Convert.ToBase64String(bytes, start, length);
}
}
Теперь загрузка выглядит так:
private async Task UploadFile(byte[] data)
{
var client = new WebClient() {Encoding = new WebClientUploaderBase64Encoding()};
string base64EncodedData = client.Encoding.GetString(data, 0, data.Length);
var base64EncodedResult = await client.UploadStringTaskAsync("http://api/query", base64EncodedData);
var resultBytes = client.Encoding.GetBytes(base64EncodedResult);
var json = Encoding.UTF8.GetString(resultBytes);
}