2013-05-11 49 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