Можно ли загружать файл, а также отправлять данные с помощью служебной программы?
Я хочу иметь возможность опубликовать файл и как часть этого сообщения добавить данные.
Вот что у меня есть:
var restRequest = new RestRequest(Method.POST);
restRequest.Resource = "some-resource";
restRequest.RequestFormat = DataFormat.Json;
string request = JsonConvert.SerializeObject(model);
restRequest.AddParameter("text/json", request, ParameterType.RequestBody);
var fileModel = model as IHaveFileUrl;
var bytes = File.ReadAllBytes(fileModel.LocalStoreUrl);
restRequest.AddFile("FileData", bytes, "file.zip", "application/zip");
var async = RestClient.ExecuteAsync(restRequest, response =>
{
if (PostComplete != null)
PostComplete.Invoke(
new Object(),
new GotResponseEventArgs
<T>(response));
});
Он записывает файл в порядке, но данных нет - возможно ли это?
[ОБНОВЛЕНИЕ]
Я изменил код для использования заголовка с несколькими частями:
var restRequest = new RestRequest(Method.POST);
Type t = GetType();
Type g = t.GetGenericArguments()[0];
restRequest.Resource = string.Format("/{0}", g.Name);
restRequest.RequestFormat = DataFormat.Json;
restRequest.AddHeader("content-type", "multipart/form-data");
string request = JsonConvert.SerializeObject(model);
restRequest.AddParameter("text/json", request, ParameterType.RequestBody);
var fileModel = model as IHaveFileUrl;
var bytes = File.ReadAllBytes(fileModel.LocalStoreUrl);
restRequest.AddFile("FileData", bytes, "file.zip", "application/zip");
var async = RestClient.ExecuteAsync(restRequest, response =>
{
if (PostComplete != null)
PostComplete.Invoke(
new Object(),
new GotResponseEventArgs
<T>(response));
});
По-прежнему не повезло... любые указатели?
Ответы
Ответ 1
Я не уверен, что это поможет. Но попробуйте.
Поскольку вы пытаетесь передать его как text/json, вы можете попытаться преобразовать ваш массив байтов в строку и добавить его в запрос.
Чтобы преобразовать его в строку, вы можете сделать что-то вроде этого.
public string ContentsInText
{
get
{
return Encoding.Default.GetString(_bytecontents);
}
}
Чтобы преобразовать его в массив байтов, вы можете это сделать. Скорее всего, вам придется сделать это в своем веб-сервисе.
public byte[] ContentsInBytes
{
get { return Encoding.Default.GetBytes(_textcontents); }
}
Ответ 2
Я не эксперт в C#
, но я использовал тот же принцип в Grails/Java для многопрофильных запросов.
Некоторые указатели (ServiceStack/С#)
Сообщение о многостраничной форме
Сообщение MSDN MIME
Вложение файла ServiceStack
Java соответствует:
Проводка файла и данных как JSON в службе REST
Надеюсь, это поможет.