使用文件将JSON发送到WCF

时间:2013-05-11 20:01:44

标签: json wcf file xmlhttprequest

如何将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));
        });

如果直接发送文件(xhr.send(this.files [0])和上传(流myfile),那么WCF会将发布的文件转换为Stream。有没有办法在内部使用Stream DataContract?

1 个答案:

答案 0 :(得分:0)

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

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