2012-11-13 65 views
1

我在一個ASMX文件中有一個WebService,但是我最終遇到了問題,因爲在某些情況下,我有太多的數據(打印分頁的網格,檢索所有數據)。發現我不能用ASMX服務配置任何與消息大小有關的東西,所以我決定去WCF路線來解決我的問題。jQuery和WCF WebService反序列化問題

轉換我現有的WebService,我創建了一個接口和實際服務,然後將我的配置添加到我的WebConfig。到現在爲止還挺好。轉換後,我無法設法讓它運行。我的方法的第一行有一個斷點,它永遠不會達到它。

Chrome在調用中給我「400(Bad Format)」錯誤,所以我去了並配置了Tracing。 在跟蹤中,我看到在調用我的方法時引發了異常。

There was an error while trying to deserialize parameter http://tempuri.org/:jsonAOData. Please see InnerException for more details. 

(全例外,在法國抱歉)

Le serveur a rencontré une erreur lors du traitement de la demande. Le message d'exception est 'Le module de formatage a généré une exception en tentant de désérialiser le message : Une erreur s'est produite en tentant de désérialiser le paramètre http://tempuri.org/:jsonAOData. Le message InnerException était 'Une erreur s'est produite lors de la désérialisation de l'objet de type System.String. Jeton 'null' attendu, mais 'name' a été trouvé.'. Pour plus d'informations, consultez InnerException.'. Pour plus d'informations, consultez les journaux du serveur. La trace de la pile d'exception est : 

à System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part) 
à System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeParameter(XmlDictionaryReader reader, PartInfo part) 
à System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, PartInfo returnInfo, Object& returnValue) 
à System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeBodyCore(XmlDictionaryReader reader, Object[] parameters, Boolean isRequest) 
à System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest) 
à System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest) 
à System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
à System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) 
à System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) 
à System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) à System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
à System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

綜觀鉻通話,它規定了以下內容:

Request URL:http://localhost:2806/MyWebApp/WebServices.svc/GetRequests 
Request Method:POST 
Status Code:400 Bad Request 
Request Headersview source 
Accept:application/json, text/javascript, */*; q=0.01 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,fr-CA;q=0.6,fr;q=0.4 
Connection:keep-alive 
Content-Length:3436 
Content-Type:application/json; charset=UTF-8 
Cookie:DOKU_PREFS=list%23thumbs; ASP.NET_SessionId=bttjyzhltsrxflcn43i0v43f; MyWebApp=ECFF341038FFA20B7357CAEE592127F98B46F7421F5388A6CCB1D8460A1A66E345D82E62F634BF2854F9008DD01C875B53B3864E3EE3511AFAC67C40AE9BB4013E367D50605B326755CA7F286EF18CD7A3E229EDA2EE8066A12DC330B293AEE549322C7AADC46306CA63402A27F6F125703D070B07EE8BBDA9AC2F185CF546DDEAF1AA6AEE6B42BAFF41BDDC690CDED8 
Host:localhost:2806 
Origin:http://localhost:2806 
Referer:http://localhost:2806/MyWebApp/Viewer.aspx 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 
X-Requested-With:XMLHttpRequest 

有效載荷(即我驗證使用JSONLint):

{"jsonAOData": "[{"name":"sEcho","value":1},{"name":"iColumns","value":33},{"name":"sColumns","value":"FileId,StateDesc,DeptDescription,Division,ConfirmProblem,TaskDescription,GenComment,FileType,Problem,TreatmentTargetDate,TreatmentPlannedDate,Responsable,ReceivedDate,NoCiv,Generic,Streetname,StreetDirection,StreetDescription,TreatmentStartDate,TreatmentCompleteDate,TreatmentDemandDate,SiteDesc,SectorOld,District,AreaOld,IntersectStreetId,Prepose,PrintedDate,Requester,AdressC,LocationPrecision,RealisedFor,Source"},{"name":"iDisplayStart","value":0},{"name":"iDisplayLength","value":-1},{"name":"mDataProp_0","value":"FileId"},{"name":"mDataProp_1","value":"StateDesc"},{"name":"mDataProp_2","value":"DeptDescription"},{"name":"mDataProp_3","value":"Division"},{"name":"mDataProp_4","value":"ConfirmProblem"},{"name":"mDataProp_5","value":"TaskDescription"},{"name":"mDataProp_6","value":"GenComment"},{"name":"mDataProp_7","value":"FileType"},{"name":"mDataProp_8","value":"Problem"},{"name":"mDataProp_9","value":"TreatmentTargetDate"},{"name":"mDataProp_10","value":"TreatmentPlannedDate"},{"name":"mDataProp_11","value":"Responsable"},{"name":"mDataProp_12","value":"ReceivedDate"},{"name":"mDataProp_13","value":"NoCiv"},{"name":"mDataProp_14","value":"Generic"},{"name":"mDataProp_15","value":"Streetname"},{"name":"mDataProp_16","value":"StreetDirection"},{"name":"mDataProp_17","value":"StreetDescription"},{"name":"mDataProp_18","value":"TreatmentStartDate"},{"name":"mDataProp_19","value":"TreatmentCompleteDate"},{"name":"mDataProp_20","value":"TreatmentDemandDate"},{"name":"mDataProp_21","value":"SiteDesc"},{"name":"mDataProp_22","value":"SectorOld"},{"name":"mDataProp_23","value":"District"},{"name":"mDataProp_24","value":"AreaOld"},{"name":"mDataProp_25","value":"IntersectStreetId"},{"name":"mDataProp_26","value":"Prepose"},{"name":"mDataProp_27","value":"PrintedDate"},{"name":"mDataProp_28","value":"Requester"},{"name":"mDataProp_29","value":"AdressC"},{"name":"mDataProp_30","value":"LocationPrecision"},{"name":"mDataProp_31","value":"RealisedFor"},{"name":"mDataProp_32","value":"Source"},{"name":"iSortCol_0","value":0},{"name":"sSortDir_0","value":"asc"},{"name":"iSortingCols","value":1},{"name":"bSortable_0","value":true},{"name":"bSortable_1","value":true},{"name":"bSortable_2","value":true},{"name":"bSortable_3","value":true},{"name":"bSortable_4","value":true},{"name":"bSortable_5","value":true},{"name":"bSortable_6","value":true},{"name":"bSortable_7","value":true},{"name":"bSortable_8","value":true},{"name":"bSortable_9","value":true},{"name":"bSortable_10","value":true},{"name":"bSortable_11","value":true},{"name":"bSortable_12","value":true},{"name":"bSortable_13","value":true},{"name":"bSortable_14","value":true},{"name":"bSortable_15","value":true},{"name":"bSortable_16","value":true},{"name":"bSortable_17","value":true},{"name":"bSortable_18","value":true},{"name":"bSortable_19","value":true},{"name":"bSortable_20","value":true},{"name":"bSortable_21","value":true},{"name":"bSortable_22","value":true},{"name":"bSortable_23","value":true},{"name":"bSortable_24","value":true},{"name":"bSortable_25","value":true},{"name":"bSortable_26","value":true},{"name":"bSortable_27","value":true},{"name":"bSortable_28","value":true},{"name":"bSortable_29","value":true},{"name":"bSortable_30","value":true},{"name":"bSortable_31","value":true},{"name":"bSortable_32","value":true}]"} 

對於ref erences,IM還包括一些配置/代碼片段,以幫助解決它:

我的(部分)的jQuery(數據表)初始化

sAjaxSource: "WebServices.svc/GetRequests", 
fnServerData: function (sSource, aoData, fnCallback) { 
    var jsonAOData = JSON.stringify(aoData); 
    $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     contentType: "application/json; charset=utf-8", 
     url: sSource, 
     data: '{"jsonAOData": "' + jsonAOData + '"}', 
     success: function (msg) { 
      fnCallback(msg.d); 
      } 
     }); 
    } 

我的方法在IWebServices定義:

[OperationContract] 
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
FormatedList GetRequests(string jsonAOData); 

它的實現(它周圍沒有任何屬性/裝飾),在WebServices.svc繼承的WebServices.cs中。

public FormatedList GetRequests(string jsonAOData) 
{ 
    // My code that was working before but never gets call now. 
} 

我的WebConfig

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WebServicesBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebServicesAspNetAjaxBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="WebServicesBehavior" name="WebServices"> 
     <endpoint address="" behaviorConfiguration="WebServicesAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="IWebServices" /> 
     </service> 
    </services> 
</system.serviceModel> 

任何想法是,我在想念着什麼呢?我敢肯定我的目標相當接近,只是無法把握最後一點點......

謝謝!

+0

我想這可能與我沒有指定任何命名空間的事實有關。在構建我的參數(jsonAOData)的時候玩弄方式,我得到了不同的反序列化例外,其中一個是: Éémementde fin'root'protant de l'espace de noms''attendu。 Trouvééléément'jsonAOData'久經考驗的'空間定律'''。加上信息,提供諮詢服務。 這意味着它在查找名稱空間的根元素時找到'jsonAOData'。 –

+1

由於您的「GetRequests」方法只接受一個String參數,因此請嘗試首先將簡單的字符串傳遞給它,如'data:「Some String」',以確保工作正常。然後傳遞一個簡單的JSON對象,比如'data:JSON.stringify({name:「some name」,value:0})',並按照你的方式來處理你需要發送的對象。這可能有助於您識別問題。 –

回答

2

問題是您的JSON數據無效。

{"jsonAOData": "[{"name":"sEcho"... 

JSON字符串與"字符開始,並且在匹配"字符結尾(除非轉義爲\")。你的字符串從[{開始,並在那裏結束。之後的字符無效(name)。

如果你想讓字符串按原樣傳遞,你實際上需要「重新JSONify」它。首先,您將創建一個要傳遞給服務的JSON字符串(jsonAOData)。然後,您將創建一個新的對象,並將其傳遞給WCF服務(並且該對象也需要JSON化) - 請參見下文。

var jsonAOData = JSON.stringify(aoData); 
var inputBody = JSON.stringify({ jsonAOData: jsonAOData }); 
$.ajax({ 
    type: "POST", 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    url: sSource, 
    data: inputBody, 
    success: function (msg) { 
     fnCallback(msg.d); 
     } 
    }); 
} 
+0

修好了!仍然有退貨問題,但這對我來說很容易理解(顯然,我的ASMX返回了一個帶有「d」屬性的對象,但新的不完全相同,並且它內部的所有數據都不相似,但這部分我應該很好地得到正確的)。 非常感謝! –

+0

是的,我將我的「msg.d」更改爲「$ .parseJSON(msg.GetRequestsResult)」,並且所有工作都像以前一樣!「再次感謝M. Figueira! –