Загружать файл из формы Html (составной/данные формы) в службу WCF REST в виде потока без потоковой передачи всех входных данных формы?

В настоящее время у меня возникла проблема при загрузке файла из 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 не имеет состояния).

Кое-что, что, возможно, стоит упомянуть: мне нужно сохранить содержимое файла в базе данных, а не в файловой системе.

Кто-нибудь может что-то сказать по этому поводу? Я как-то застрял на этом...

Спасибо!

6
задан StriVa 16 March 2012 в 09:45
поделиться