4

GETWCF Web サービスに対して要求を行っています。私の WCF サービスは次の場所にhttp://localhost/RestService/RestService.svc/web/GetMessageあり、次のインターフェイスがあります。

[OperationContract]
[WebGet(UriTemplate = "GetMessage", ResponseFormat = WebMessageFormat.Json)]
String GetMessage();

エンドポイントは適切に構成されているため、ブラウザー内で単純な呼び出しを行うことができます。

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WebServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>

      <endpointBehaviors>
        <behavior name="WebEndpointBehavior">
          <webHttp />
          </behavior>
      </endpointBehaviors>
    </behaviors>

    <services>
      <service name="TestRestService.RestService"
               behaviorConfiguration="WebServiceBehavior">
        <endpoint name="RestWeb"
                  address="web"
                  binding="webHttpBinding"
                  behaviorConfiguration="WebEndpointBehavior"
                  contract="TestRestService.IRestService" />
      </service>
    </services>
  </system.serviceModel>

ブラウザのナビゲーションから呼び出すと、次のように返されます。

{"GetMessageResult":"Hello World!"}

ここまでは順調ですね。ここでは問題ありません。イールドを実行するためのjQuery ドキュメントを簡単に見てみましょう。GET

<html>
    <head>
        <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
        <script type="text/javascript">
            $.ajax({
                url: 'http://localhost/RestService/RestService.svc/web/GetMessage',
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    alert(data);
                },
                error: function (xhr, status, message) {
                    alert("Error: " + status + " " + message); }
                });
        </script>
    </head>
    <body>
    </body>
</html>

jQuery 1.72 を使用して小さな html テスト ページでこれを実行すると、次のエラーが発生します。

Error: error

何を与える?ここで見つけたエラー メッセージ ハンドラーからは、有用な情報がまったく得られません。簡単に言えば:

  • GET が失敗するのはなぜですか?
  • エラーメッセージが役に立たないのはなぜですか?

解決

結局のところ、jQueryはクロスドメインの ajax リクエストをネイティブにサポートしていません。これを修正するには、使用に切り替えて、プロパティを有効にしdataType: 'jsonp'て追加する必要がありました。webHttpBindingcrossDomainScriptEnabled

<bindings>
  <webHttpBinding>
    <binding name="WebBindingWithScripts"
             crossDomainScriptAccessEnabled="true">
      <security mode="None" />
    </binding>
  </webHttpBinding>
</bindings>


<endpoint name="RestWeb"
          address="web"
          binding="webHttpBinding"
          behaviorConfiguration="WebEndpointBEhavior"
          bindingConfiguration="WebBindingWithScripts"
          contract="TestService.IRestService">
</endpoint>

のみを使用する場合dataType: 'jsonp'でも、クロス ドメイン スクリプトを許可するように WCF サービスを構成しない限り、エラーが発生します。

4

2 に答える 2

2

これは私に一度起こりました。私がしたことは、web.config に endpointBehaviors を追加して、このような WebHttp リクエストをサポートすることだけでした。

  <behaviors>
  <serviceBehaviors>
   ......
   </behavior>
  </serviceBehaviors>   
  <endpointBehaviors>
        <behavior name="EndpBehavior">
            <webHttp/>
        </behavior>
    </endpointBehaviors>

エンドポイントを変更して「behaviorConfiguration」を含め、バインディングを変更しました

 <endpoint address="" binding="webHttpBinding" contract="IService1" 
  behaviorConfiguration="EndpBehavior">

これを IService に追加することを忘れないでください:

[WebGet(ResponseFormat =WebMessageFormat.Json)]
于 2012-06-29T17:31:28.197 に答える
2

クロスドメイン リクエストを行っていますか? localhost を使用しているように見えますが、必ずしも localhost からリクエストしているとは限りません (別のポートまたはプロトコルを使用している可能性があることはわかっています)。

この場合、リクエストが失敗する理由は 2 つあります。

  1. 返される JSON に追加の文字が含まれているため、無効な json になります
  2. リクエストは、Web サービスとは異なるドメインからのものです。

same-originコンソールにエラーが表示されないため、#1 になると思います。ただし、取得しているerrorのでparseerror、そうではありません。

于 2012-06-29T16:44:09.390 に答える