wCFサービスにあるrestメソッドにjsonデータを投稿するためにjqueryを取得するのに問題があります。
WCF側では、運用契約は次のとおりです。
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
との両方MyResult
にMyRequest
必要なすべての属性と属性がマークされておりDataContract
、DataMember
サービスはWebHttpエンドポイントを公開しています。
JQuery側では、これが私の関数呼び出しです。
var jsonStr = JSON.stringify(reqObj);
$.ajax({
type: "POST",
dataType: "json",
url: "http://localhost/MyService/PostSomething",
contentType: "application/json; charset=utf-8",
data: jsonStr,
success: function (html) {
alert(html);
}
});
このリクエストは私のメソッドに到達することはなく(毎回405メソッドが許可されていません)、Charlesでリクエストを見ると次のようになります。
OPTIONS /MyService/PostSomething HTTP/1.1
Host: localhost
Cache-Control: max-age=0
Access-Control-Request-Method: POST
Origin: null
Access-Control-Request-Headers: Content-Type, Accept
Accept: */*
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
これについて奇妙なことがいくつかあります:
- メソッドはPOSTではなくOPTIONSです
text/html; charset=UTF-8
jsonの代わりに(別のタブの)コンテンツタイプが表示されます- JSONデータはどこにも見られません
ただし、Charlesでリクエストを変更して、ヘッダーがここのソリューションと同様になるようにすると、すべてが機能します。
POST /MyService/PostSomething HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost
Content-Length: 152
{"Id":"", "Name":"testspot","Description":"test" }
ここでチュートリアルやその他の質問を見ると、他の人がJQueryにこのようなWCF RESTメソッドに投稿させることができましたが、ここで何が間違っているのか途方に暮れています。
ちなみに、これはWCF 4サービスであり、JQuery1.4.4を使用しています。
ありがとう、
アップデート:
もう少し読んだ後、クロスドメイン仕様を教えてくれたDarrelに感謝し、サービスインターフェイスでサービスに小さな変更を加えることで、もう少し先に進むことができました。
[OperationContract]
[WebInvoke(Method = "*",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
実装では、着信要求がOPTIONSに対するものであるかどうかを確認する必要があります。その場合、意図した作業を行うのではなく、いくつかのヘッダーを返します。
if (WebOperationContext.Current.IncomingRequest.Method == "OPTIONS")
{
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept");
return null;
}
次に、メソッドが2回呼び出されます。最初は、サーバーがnullを返しますが、クライアントにいくつかのヘッダーを追加します。その後、実際の要求はPOSTをメソッドとして使用して行われ、サーバーは先に進んで要求を通常どおり処理します。