wcf - 取得 - webinvoke json




JSONデータをJQueryからWCF RESTメソッドに送信する際の問題 (4)

私はいくつかのjsonをいくつかのjsonデータを私がWCFサービス上に持っている残りのメソッドに投稿するのに問題があります。

WCF側では、運営契約があります:

[OperationContract]
[WebInvoke(Method = "POST",
           BodyStyle = WebMessageBodyStyle.Bare,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);

MyResultMyRequest両方に必要なすべての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メソッドが許可されていません)。チャールズのリクエストは次のようになります。

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

これについて不思議なことのカップル:

  1. メソッドはPOSTではないOPTIONSです。
  2. content-type(別のタブ)はtext/html; charset=UTF-8表示しtext/html; charset=UTF-8 text/html; charset=UTF-8 jsonの代わりにtext/html; charset=UTF-8
  3. JSONデータはどこに見えません

しかし、チャールズのリクエストを修正して、そのヘッダがhereのソリューションに似てhereと、すべてが機能します:

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サービスであり、私はJQuery 1.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によって行われ、サーバーは先に進み、要求を正常に処理します。


あなたのweb.configでwebhttpbindingを使用しましたか?

webhttpbindingのみjsonをサポートしています。



更新:

MyServiceの後に.svcを入れて、URLが読み込まれるようにしてください

http://localhost/MyService.svc/PostSomething

先日私はこれについて取り組んでいましたが、Rick Strahlのブログのポストを見つけました:

http://www.west-wind.com/weblog/posts/324917.aspx

これは私のために完璧に動作しますので、試してみてください!

希望が助けてくれる! :)


私はちょうど私を助けた短い答えを投稿します、他の答えはしなかったので。

  • シナリオ:wcfサービスへのajax呼び出し。
  • エラーの原因:POSTリクエストを送信する前に、ajaxから自動OPTIONS要求。 最初のリクエストは私のサービスで処理できませんでした。
  • 解決策:OPTIONS要求を許可し、それに応答します。

するべきこと:

  1. これをweb.configに追加します:

    <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>
    

  2. これをGlobal.asax.csに追加します(ソリューションにこのファイルがない場合は、新しい項目の追加=> Visual C#=>グローバルアプリケーションクラス(デフォルト名は "Global.asax"))

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                        HttpContext.Current.Response.End();
    }
    




http-options-method