GET
WCF 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'
て追加する必要がありました。webHttpBinding
crossDomainScriptEnabled
<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 サービスを構成しない限り、エラーが発生します。