2013-05-11 48 views
1

如何将JSON内的文件发送到服务?使用文件发送JSON到WCF

[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如流,但收到和错误:“不能创建抽象类的实例”。

 $('#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张贴的文件转换成流。有没有办法做到这一点与DataContract中的流?

回答

0

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

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

+0

请添加已更正的代码示例,并将您的问题标记为已回答 – 2014-04-12 13:42:16