5

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

jQuery は次のとおりです。

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

WCF サービス定義は次のとおりです。

[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「メッセージが空であるため、OperationFormatter はメッセージからの情報を逆シリアル化できませんでした (IsEmpty = true)」ということわざがあります 。

メソッド・System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequestオン・インストラクションで発生00000108 mov dword ptr [ebp-18h],0

何が間違っているのかわかりませんが、うまくいきません。一日中これと戦っています。何か案は?

4

1 に答える 1

4

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

回避策: POST と OPTIONS を、UriTemplate は同じで C# 名が異なる 2 つのメソッドに分けます (WCF ではこれが必要です)。

[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();

すべての関数を散らかす必要がないため、実際にはコードが少しクリーンアップされます

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") { ... }
于 2012-04-29T02:20:40.987 に答える