如何将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?
答案 0 :(得分:0)
事实证明答案是肯定的。您必须将类定义为MessageContract而不是DataContract,只允许一个属性为[MessageBodyMember]。其他属性为[MessageHeader]。
WCF不会将多部分表单数据映射到DataContract或MessageContract。显然这是由于WCF没有缓冲邮件正文并反而流式传输。消息正文可能非常大,所以确实有意义。