В настоящее время у меня возникла проблема при загрузке файла из Html в службу отдыха (WCF REST). При загрузке файла я хотел бы отправить такую информацию, как заголовок и описание, вместе с содержимым файла.
Итак, я создал тестовую форму, подобную этой:
<form id="testForm" action="http://localhost.:1576/NotepadService.svc/Note/91f6413c-4d72-42ca-a0f3-38df15759fc9/Attachment" method="POST" enctype="multipart/form-data">
<table>
<tr><td>Title:</td><td><input type="text" name="Title"></td></tr>
<tr><td>Description:</td><td><input type="text" name="Description"></td></tr>
<tr><td>Filename:</td><td><input type="text" name="Filename"></td></tr>
<tr><td>File:</td><td><input type="file" name="Contents"></td></tr>
<tr><td/><td><input type="submit" value="Send"></td></tr>
</table>
</form>
Серверная сторона, я хотел бы преобразовать ее в этот метод:
[OperationContract]
[WebInvoke(
BodyStyle = WebMessageBodyStyle.Bare,
Method = "POST",
UriTemplate = "/Note/{noteId}/Attachment")]
[Description("Add an attachment to a Note.")]
void AddAttachmentToNote(string noteId, AttachmentRequestDto attachmentRequestDto);
С AttachmentRequestDto, определенным как
[DataContract]
public class AttachmentRequestDto
{
[DataMember]
public string Title { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public string Filename { get; set; }
[DataMember]
public Stream Contents { get; set; }
}
Итак, короче говоря, я хотел бы получить заголовок и описание в виде строковых значений, получая при этом содержимое файла в виде потока. Похоже, это не работает, так как html-форма поместит все содержимое формы (а также заголовок и описание) в поток вместе с содержимым файла. Поэтому определение моего метода REST как
[OperationContract]
[WebInvoke(
BodyStyle = WebMessageBodyStyle.Bare,
Method = "POST",
UriTemplate = "/Note/{noteId}/Attachment")]
[Description("Add an attachment to a Note.")]
void AddAttachmentToNote(string noteId, Stream formContents);
работает, но затем мне нужно проанализировать поток, чтобы получить все мои данные (что не очень хороший подход по сравнению с тем, что я действительно хочу сделать).
Может быть, мне нужно определить 2 разных метода обслуживания, один из которых принимает только файл, а другой — сведения о файле? Однако это означало бы, что мои бизнес-правила (требуется заголовок + требуется содержимое файла) должны проверяться по-разному (поскольку REST не имеет состояния).
Кое-что, что, возможно, стоит упомянуть: мне нужно сохранить содержимое файла в базе данных, а не в файловой системе.
Кто-нибудь может что-то сказать по этому поводу? Я как-то застрял на этом...
Спасибо!