0

複雑なオブジェクトを WCF REST サービスにアップロードしようとしています。Stream タイプのオブジェクトと他のパラメーターを同時にエンドポイントにアップロードする最も簡単な方法と思われるため、これを行っています。

サービス:

[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");
    }
});
4

1 に答える 1

0

デフォルトで$.ajaxは、フォーマットを使用してオブジェクトをエンコードしapplication/x-www-form-urlencodedます。content-type は 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"); 
    } 
}); 

dataType: "jsonp"また、 POST リクエストには指定できません。JSONP は GET リクエストにのみ適用されます。

Stream契約に関するもう 1 つの問題:データ契約の一部として持つことはできません。Streamは抽象クラスであり、WCF シリアライザーは抽象クラスに逆シリアル化する方法を知りません。JS コードの「ファイル」の種類は正確には何ですか? それがファイルの内容であれば、文字列に格納されていますか? その場合は、コントラクトで文字列をデータ型として使用してください。

于 2012-10-11T17:33:50.837 に答える