2011-06-17 69 views
3

我有同樣的問題,按照這樣的問題:WCF not deserializing JSON inputWCF不反序列化JSON - 在Web服務的參數爲空

我在一個解決方案茫然和絕望。我已經在網上尋找答案,但我發現只有這個問題符合我的確切問題。服務啓動時,我的datacontract參數也沒有任何作用。

我已經在上面的問題中嘗試了答案的要點,但是它們沒有提供任何線索(Web服務執行OK - 我沒有收到任何異常 - 而且我也看不到什麼解串器在做什麼 - 或者視情況而定)。我對WCF服務很陌生,所以請和我一起裸照。

由於嵌套JSON的大小,我使用POST。

請問一些WCF的精靈,或者那個問題的原始海報,請賜教?

如果需要更詳細的信息,我會根據要求提供。我的問題非常類似於我希望OP能夠通過他如何解決問題的問題。

更新

代碼片段 - 我保密協議,所以不能發佈細節。

「在頁JS」:

var settings = { 
     a: $("#a").val(), 
     b: $("#b").val(), 
     c: $("#c").val(), 
     d: $("#d").val(), 
     e: $("#e").val(), 
     f: $("#f").prop("checked").toString(), 
     g: $("#g").prop("checked").toString() 
    }; 

    var data= { 
     a: [1011,1012,1013], 
     b: JSON.stringify(settings), 
     c: "01/01/2011 23:59:59" 
    }; 

Library.Services.Post("path/to/service/Service.svc/SaveSettings", data, true, function (result) { 

     if (result.Succeeded) { 
      ShowSuccess("Success."); 
     } 
     else { 
      ShowError("Failure."); 
     } 

    }); 

「Library.Services.Post」:

Post: function (serviceUrl, data, async, successHandler, errorHandler) { 
     var continueOperation = true; 

     if (!data) { 
      data = "{}"; 
     } 

     try { 
      var obj = $.parseJSON(data); 
      obj = null; 
     } 
     catch (err) { 
      continueOperation = false; 
      JS.ShowError("Data attribute is not a valid JSON object"); 
     } 

     if (typeof (data) !== "string") { 
      data = JSON.stringify(data); 
     } 

     if (continueOperation) { 
      Library.Services._ajax("POST", serviceUrl, data, async, successHandler, errorHandler); 
     } 

     continueOperation = null; 
    } 

「Library.Services._ajax」:

_ajax: function (method, serviceUrl, data, async, successHandler, errorHandler) { 

     if (!typeof (successHandler) === "function") { 
      continueOperation = false; 
      ShowError("Success handler must be a function"); 
     } 

     try { 
      $.ajax({ 
       async: async, 
       cache: false, // don't cache results 
       type: method, 
       url: Library.Services.baseUrl + serviceUrl, 
       contentType: "application/json; charset=utf-8", 
       data: data, 
       dataType: "json", 
       processData: false, // data processing is done by ourselves beforehand 
       success: function (data, statusText, request) { 

        if (data != null) { 
         if (data.d && data.d.__type) { 
          data = data.d; 
         } 
         else { 
          // Wrapped message: return first property 
          $.each(data, function (name, value) { 
           data = value; 
           return false; 
          }); 

         } 
        } 

        successHandler(data, statusText, request); 

       }, 
       error: function (request, statusText, error) { 
        //debugger;  
        var res = request.responseText; 

        if (request.status != 200) { 
         if (!request.isResolved()) { 
          ShowError(request.status + " " + request.statusText); 
         } 
         else { 
          ShowError("Request could not be resolved."); 
         } 
        } 
        else { 
         ShowError("Unknown error status."); 
        } 

        if (typeof (errorHandler) === "function") { 
         errorHandler(); 
        } 

       } 
      }); 
     } 
     catch (err) { 
      ShowError("AJAX call failed"); 
     } 
    } 

「服務.svc「:

<DataContract()> 
Public Class SaveSettingsContract 
    <DataMember(Order:=1)> 
    Public a() As String 

    <DataMember(Order:=2)> 
    Public b()() As String 

    <DataMember(Order:=3)> 
    Public c As String 

End Class 

<OperationContract()> 
<WebInvoke(BodyStyle:=WebMessageBodyStyle.Wrapped, 
     RequestFormat:=WebMessageFormat.Json, 
     ResponseFormat:=WebMessageFormat.Json)> 
Public Function SaveSettings(ByVal settings as SaveSettingsContract) As WebServiceResults.BaseResult 

    ' At this point in debugging, settings is Nothing 


End Function 
+0

添加了更多信息和代碼示例。 – 2011-06-17 12:28:59

回答

1

我相信我找到了這個問題的答案。

我覺得參數爲空的原因是因爲這樣的:

var data= { 
    a: [1011,1012,1013], 
    b: JSON.stringify(settings), 
    c: "01/01/2011 23:59:59" 
}; 

應該是這樣的:

var data = { 
    settings: { 
     a: [1011,1012,1013], 
     b: JSON.stringify(settings), 
     c: "01/01/2011 23:59:59" 
    } 
} 

我想需要被包裹在一個settings變量相匹配的名稱的數據SaveSettings方法的參數。該服務不會自動將您發送的數據放入settings參數中。

這聽起來非常明顯,現在我回頭看看它,但由於某種原因,我最初創建服務時錯過了這一點。

編輯:我相信我錯過了這一點,因爲使用舊的asmx服務,您可以按照與參數相同的順序傳遞數據,並且服務會使用正確的值自動填充參數。然而,在WCF中,情況並非如此,您必須明確指定它們。

2

如果不知道整個代碼是很難說的,但也許可以幫助您診斷問題。

創建小型測試應用程序(控制檯已足夠)將使用DataContractJsonSerializerdirectly。一旦你有了這個幫助器工具,你可以嘗試將捕獲的JSON消息反序列化到你的數據協定(使用Fiddler來捕獲JSON),或者你可以嘗試創建你期望的數據協定並序列化它並比較序列化和傳入消息(它們必須相同) 。