2012-10-11 43 views
0

我想上傳一個複雜的對象到我的WCF REST服務。我這樣做是因爲它似乎是同時將Stream類型對象和其他參數上載到端點的最簡單方法。上傳一個複雜的對象到JQuery的WCF REST服務

服務:

[OperationContract] 
[WebInvoke(Method = "POST", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "Upload")] 
public string upload(UploadObject uploadObject) 
{ 
    return uploadObject.stream.ToString() + " " + uploadObject.guid; 
} 

[DataContract] 
public class UploadObject 
{ 
    [DataMember] 
    public Stream stream { get; set; } 
    [DataMember] 
    public string guid { get; set; } 
} 

JQuery的

var guid = getParameterByName("guid"); //<--gets value from query string parameter 
var file = $('#btnUpload').val(); //<--value from a file input box 
var uploadObject = { stream: file, guid: guid }; 

$.ajax({ 
    type: "POST",    
    contentType: "application/json", 
    url: "localhost/service/Upload", 
    data: uploadObject, 
    datatype: "jsonp", 
    processData : false,   
    success: function(data){ 
     alert(data); 
    }, 
    error: function (xhr, status, error) { 
     alert("fail"); 
    } 
}); 

回答

0

默認$.ajax將使用application/x-www-form-urlencoded格式編碼的對象。你說的內容類型是JSON,所以你也應該編碼使用格式(使用JSON.stringify應該做的伎倆)對象:

var guid = getParameterByName("guid"); //<--gets value from query string parameter 
var file = $('#btnUpload').val(); //<--value from a file input box 
var uploadObject = { stream: file, guid: guid }; 

$.ajax({ 
    type: "POST",    
    contentType: "application/json", 
    url: "localhost/service/Upload", 
    data: JSON.stringify(uploadObject), 
    processData : false,   
    success: function(data){ 
     alert(data); 
    }, 
    error: function (xhr, status, error) { 
     alert("fail"); 
    } 
}); 

而且,你不能POST請求指定dataType: "jsonp"。 JSONP僅適用於GET請求。

您的合同還有一個問題:您不能將Stream作爲數據合同的一部分; Stream是一個抽象類,WCF序列化程序不知道如何反序列化爲抽象類。你的JS代碼中「文件」的類型究竟是什麼?如果它是文件內容,是否存儲在一個字符串中?如果是這樣,請在您的合同中使用字符串作爲數據類型。

+0

合同的全部目的是向服務發佈一個流和一個字符串。那麼完成這個的最好方法是什麼?另外我試圖從輸入類型文件中獲取實際的文件 – user1134179