1

JSON内のファイルをサービスに送信する方法は?

    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Json)]
    public string Upload(UploadRequest request)
    {
        return request.FileBytes.Length.ToString();
        //return request.FileName;
    }

    [DataContract]
    public class UploadRequest
    {
        [DataMember]
        public int ProfileID { get; set; }

        [DataMember]
        public string FileName { get; set; }

        [DataMember]
        public byte[] FileBytes { get; set; }
    }

FileBytes を Stream として試しましたが、「抽象クラスのインスタンスを作成できません」というエラーが表示されました。

        $('#file2').change(function () {
            var request =
            {
                "ProfileID": 1,
                "FileName": this.files[0].name,
                "FileBytes": this.files[0]
            }

            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'http://localhost:45039/Files.svc/Upload', true);
            xhr.setRequestHeader("Content-type", "application/json");

            xhr.onreadystatechange = function (aEvt) {
                if (this.readyState == 4) {
                    if (this.status == 200)
                        $("#status").html(this.responseText);
                    else
                        $("#status").html("Error " + this.status.toString() + ": " + this.responseText);
                }
            };

            xhr.send(JSON.stringify(request));
        });

ファイルが Upload(Stream myfile) で直接 (xhr.send(this.files[0]) 送信される場合、WCF は投稿されたファイルを Stream に変換します。DataContract 内の Stream でそれを行う方法はありますか?

4

1 に答える 1

0

答えはイエスです。[MessageBodyMember] にできるプロパティが 1 つだけの DataContract ではなく、MessageContract としてクラスを定義する必要があります。その他のプロパティは [MessageHeader] です。

WCF は、マルチパート フォーム データを DataContract または MessageContract にマップしません。どうやらこれは、WCF がメッセージ本文をバッファリングせず、代わりにストリーミングしているためです。メッセージ本文は非常に大きくなる可能性があるため、それは理にかなっています。

于 2013-05-13T23:22:16.647 に答える