2

考えられるほぼすべてのことを試しましたが、WCF サービスへの ajax 呼び出しでまだ問題が発生しています。

私のWCFサービスには、以下のようなメソッドがあります:

//[WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "POST")]
[WebGet]    
public string Test(int value)
{
    return string.Format("You entered: {0}", value);
}

Patrick Thomas が Twitter で述べたように、私も[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped)]and[WebGet(BodyStyle = WebMessageBodyStyle.WrappedResponse)]を使用してみましたが、うまくいきませんでした。

そして、次のような構成:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="RestEndpoint">
                <enableWebScript/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
        <webHttpBinding>
            <binding name="NoSecurityRestBinding" crossDomainScriptAccessEnabled="true">
                <security mode="None" />
            </binding>
        </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service name="WebServices.TestService">
            <endpoint address="" binding="webHttpBinding" contract="WebServices.ITestService" bindingConfiguration="NoSecurityRestBinding" behaviorConfiguration="RestEndpoint" />
        </service>
    </services>
</system.serviceModel>

サービスは別のドメインにあるため、データを JSONP としてフォーマットしています。

$.ajax({
    cache: false,
    async: true,
    type: "GET", // Was "POST"
    dataType: "jsonp",
    url: "http://mydomain.com/TestService.svc/Test?callback=?",
    data: dataToPost,
    contentType: "application/json;charset=utf-8",
    success: function (msg) {
        var testMsg = JSON.parse(msg);
        var status = testMsg.TestResult;
        alert(status);
    },
    error: function (msg) {
        alert('Please email Jason with this exception: ' + msg.statusText);
    }
});

そして、私は得ています:

「パーサーエラー」

「jQuery16408722478272714725_1332817261195 は呼び出されませんでした」

何が間違っている可能性がありますか?すべての WCF バイナリが 4.0 であることを確認しました。

よろしくお願いします。

4

6 に答える 6

2

WCF の web.config の煩わしさを避けたい場合は、WCF マークアップに "Factory" 属性を追加できます。

JSONP 呼び出しも行い、パーサーエラーの問題を回避したい場合は、次のクラスを使用します。

<%@ ServiceHost Language="C#" Service="MyWebApp.MyWCFService" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"  %>

次のクラスを使用して、ファクトリをオーバーライドします

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel.Activation;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Description;

public class JSONPEnabledWebServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new JSONPEnabledWebServiceHost(serviceType, baseAddresses);
    }

    private class JSONPEnabledWebServiceHost : WebServiceHost
    {
        public JSONPEnabledWebServiceHost(Type serviceType, Uri[] baseAddresses) : base(serviceType, baseAddresses)
        {
        }

        protected override void OnOpening()
        {
            base.OnOpening();
            foreach (ServiceEndpoint endpoint in this.Description.Endpoints) {
                WebHttpBinding webBinding = endpoint.Binding as WebHttpBinding;
                if (webBinding != null) {
                    webBinding.CrossDomainScriptAccessEnabled = true;
                }
            }
        }
    }
}

だから今あなたの工場属性は

<%@ ServiceHost Language="C#" Service="MyWebApp.MyWCFService" Factory="MyWebApp.JSONPEnabledWebServiceHostFactory"  %>
于 2012-09-28T09:02:38.320 に答える
2

enableWebScript動作をエンドポイントに適用したくありません。これにより、すべての要求/応答に対して特定の JSON エンコーディングを持つ Microsoft の ASP.NET AJAX クライアント スタックのサポートが具体的に有効になります。それを代わりに置き換えてwebHttp、問題が解決するかどうかを確認してください。他のすべては私には問題ないように見えます。

次にお勧めするのは、behavior 要素automaticFormatSelection属性も true に設定することです。webHttpこのようにして、HTTP 要求の受け入れられたコンテンツ タイプが JSON であることを検出したときに、応答を JSON としてシリアル化することが保証されます。

アップデート

私が思い出したのは、これは JSONP であるため、リクエストは<script/>タグから送信されるため、WCF はおそらくデフォルトで XML レスポンスになるということです。したがって、デフォルトで JSON を使用して応答をフォーマットするように、動作設定する必要があります。defaultOutgoingResponseFormat="Json"webHttp

補足として、contentTypejQuery AJAX リクエストに を設定しても意味がありません。JSONP リクエストはすべてクエリ文字列ベースであるため、本文がないからです。

于 2012-03-27T15:18:46.800 に答える
2

この問題は、過去 3 年間に何度か私を悩ませてきました。会うたびに修正して、メモを取るのを忘れていました。次にそれが起こったとき、私はもう一度スクラッチを開始し、解決策を探します. そこで、私の解決策をここに記録し、この問題に対処する可能性のある人と共有しましょう。以下の手順に従って、.net Framework 4.0 で JQuery 1.8 以降を使用していることを確認してください。

  • system.serviceModel ノートの下の動作ノートで、webHttp に設定します。
<behaviors>
  <endpointBehaviors>
    <behavior name="webHttpBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
  • JsonP バインディングを定義します。
<bindings>
      <webHttpBinding>
        <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>
    </bindings>
  • サービスの bindingConfiguration を、定義したばかりのバインディングに設定します
<services>
  <service name="dpRestService.qcmmsService">
    <endpoint address="" behaviorConfiguration="webHttpBehavior"
      binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP"
      contract="gwsRestService.qcmmsService" />
  </service>
</services>
  • ResponseFormat 属性の応答形式として Jaon を追加

[WebGet(UriTemplate = "あなたのサービス テンプレート" , ResponseFormat = WebMessageFormat.Json)]

  • Jquery リクエスト:

$.ajax({ url: url, type: 'GET', //ajax 呼び出しデータのタイプ: {}, contentType: 'application/json', crossDomain: true, dataType: 'jsonp',
success: callBackFun, error: errorFun });

これが役立つことを願っています。

于 2013-12-11T00:04:38.710 に答える
1

jsonpCallbackオプションを追加する

$.ajax({

    jsonpCallback: 'yourCallbackFunctionName',

    cache: false,
    async: true,
    type: "GET", // Was "POST"
    dataType: "jsonp",
    url: "http://mydomain.com/TestService.svc/Test?callback=?",
    data: dataToPost,
    contentType: "application/json;charset=utf-8",
    success: function (msg) {
        var testMsg = JSON.parse(msg);
        var status = testMsg.TestResult;
        alert(status);
    },
    error: function (msg) {
        alert('Please email Jason with this exception: ' + msg.statusText);
    }
});
于 2013-01-26T08:40:34.287 に答える
1

JSONP およびクロス ドメイン呼び出しは、POST 要求をサポートしていません。JSONP は、パディング (コールバック関数) でラップされた JSON フラグメントを返します。この背後scriptでは、クロス ドメイン アドレスを指しているページ DOM に動的に追加された要素として処理されます。対象のスクリプト リソースが読み込まれると、コールバック関数が実行されます。そのため、GET リクエストしか使用scriptできません。要素は POST を実行できません。

于 2012-03-27T08:42:37.020 に答える
-1

多くの苦労の末、コールバックでjsonpを返す単純な残りのサービスへの単純なjquery / ajax呼び出しを取得することができました。URLにコールバックを設定しようとした後、「jsonpCallback」とコールバック名をparamsに追加することで、最終的に機能させることができました。

$.ajax({
        type : 'GET',
        url : 'http://localhost:8080/RestimpleApp/report/extract',
        dataType : 'jsonp',
        jsonpCallback : "jsoncallback",
        success : function(json) {
            alert('success');

        },
        error : function(jqXHR, status) {
            alert("Failed " + status + jqXHR);
        }
    });

サーバー側では、応答 JSON をコールバック名 ("jsoncallback") でラップする必要がありました。

@GET
@Produces({ MediaType.APPLICATION_JSON })
public String extractData() {
    System.out.println("Incoming call = ");
    StringBuilder json = new StringBuilder("jsoncallback(");

    json.append("{\"sEcho\": 7,");
    json.append("\"iTotalRecords\": \"600\",");
    json.append("\"iTotalDisplayRecords\": \"12\",");
    json.append("\"aaData\": [");
    json.append("{");
    json.append("\"engine\": \"Gecko\",");
    json.append("\"browser\": \"Firefox 1.0\",");
    json.append("\"platform\": \"Win 98+ / OSX.2+\",");
    json.append("\"version\": \"1.7\",");
    json.append("\"grade\": \"A\"");
    json.append("},");
    json.append("{");
    json.append("\"engine\": \"Gecko\",");
    json.append("\"browser\": \"Firefox 1.5\",");
    json.append("\"platform\": \"Win 98+ / OSX.2+\",");
    json.append("\"version\": \"1.8\",");
    json.append("\"grade\": \"A\"");
    json.append("}  ]");
    json.append("}");
    json.append(");");


    return json.toString();
}

これを機能させるために何時間も無駄にしました:(

于 2014-03-26T05:00:33.590 に答える