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

事实证明答案是肯定的。您必须将类定义为 MessageContract 而不是 DataContract,只有一个属性允许为 [MessageBodyMember]。其他属性为 [MessageHeader]。

WCF 不会将多部分表单数据映射到 DataContract 或 MessageContract。显然,这是由于 WCF 没有缓冲消息正文并将其流式传输。消息正文可能非常大,因此确实有意义。

于 2013-05-13T23:22:16.647 回答