2012-04-29 15 views
4

ajaxリクエストに応答するWCFサービスを作成しようとしていますが、デシリアライズしようとすると奇妙なエラーが発生します。WCFがJSONリクエストの逆シリアル化に失敗しました

ここでjQueryの:ここで

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:4385/Service.svc/MyMethod', 
    dataType: 'json', 
    contentType: 'application/json', 
    data: JSON.stringify({folder:"test", name:"test"}) 
}); 

だWCFサービスの定義:「メッセージが空のためOperationFormatterは、メッセージから任意の情報をデシリアライズできませんでした:

[OperationContract] 
[WebInvoke(UriTemplate = "/MyMethod", 
    Method = "*", //Need to accept POST and OPTIONS 
    BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)] 
string[] MyMethod(string folder, string name); 

私はSerializationExceptionが言ってもらいます(IsEmpty = true)」と表示されます。

それは命令00000108 mov dword ptr [ebp-18h],0

に方法System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequestで発生し、私は私が間違ってやっているか見ていないが、それは私のために働くことを拒否します。一日中これと戦っている。何か案は?

答えて

2

私のコードの唯一のコメントで答えが私を見つめていました。 POSTとOPTIONS(CORS用)の両方を受け入れる必要がありました。 OPTIONSリクエストが最初に来ていました。もちろん、OPTIONSリクエストにはデータが添付されていません。 そのが解析例外の原因となっていました。 POSTは決して起こらなかった。

回避策:POSTとOPTIONSを別々のUriTemplateを使用して別々のメソッドに分割しますが、異なるC#名を使用してください(WCFではこれが必要です)。あなたは

if (WebOperationContext.Current.IncomingRequest.Method == "OPTIONS") { 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "OPTIONS, POST"); 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, User-Agent"); 
    return new string[0]; 
} else if (WebOperationContext.Current.IncomingRequest.Method == "POST") { ... } 
でごみにすべての機能を持っていないため、実際にコードを少しクリーンアップ

[OperationContract] 
[WebInvoke(UriTemplate = "/MyMethod", 
    Method = "POST", 
    BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)] 
string[] MyMethod(string folder, string name); 

[OperationContract] 
[WebInvoke(UriTemplate = "/MyMethod", Method = "OPTIONS")] 
void MyMethodAllowCors(); 

関連する問題