クロスドメインコール(jQueryとJSONPを使用)で使用しようとしているWCFサービスが作成されました。私はサービスを書いて、Visual Studioのデバッガでそれを実行し、私のローカルPCのテストページから呼び出すと正常に動作します。サーバー上のIIS7にサービスを展開すると、機能しません。フィドラーとそれを見て、私は戻ってくる400のエラーがあることがわかります。WCF JSONP Webサービスメソッドを呼び出すとエラー400が発生する
これはWCFサービスを作成する私の最初の試みであり、JSONPでの私の最初の試みでもありますので、シンプルで重要なことを逃した可能性が非常に高いです。
私は、このサービスの2つの方法、単なる文字列を取り、それを返します(のGetDataと呼ばれる)1本当にシンプルなものを持っている - 私は、基本的なサービス機能をテストするには、この1を作成した(つまり、私はちょうどURLを置くことができますブラウザに戻って、私はいくつかのJSONを取得します)、それは正常に動作します。他の問題のあるもの(GetMatter)はいくつかのパラメータをとり、別の(SOAP)Webサービスを呼び出してデータを取得し、コールバック関数の呼び出しを含むStreamを返します。これは呼び出しページに挿入され、結果が表示されます。
契約は次のようになります。
実装はこのようになります[ServiceContract]
public interface IOracleService
{
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getData/{value}")]
string GetData(string value);
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "getMatter/{matterId}/{callback}")]
Stream GetMatter(string matterId, string callback);
}
:
私の簡単なTest.htmlというページは、この試験の目的のために(次のようになりますpublic class OracleService : IOracleService
{
public string GetData(string value)
{
return string.Format("You entered: {0}", value);
}
public Stream GetMatter(string matterId, string callback)
{
//call web service
var serviceResult = <call to web service goes here>;
//serialize data to json
JavaScriptSerializer js = new JavaScriptSerializer();
string jsonResult = js.Serialize(serviceResult.data);
jsonResult = jsonResult.Substring(1, jsonResult.Length - 2);
string result = callback + "(" + jsonResult + ");";
return new MemoryStream(Encoding.UTF8.GetBytes(result));
}
}
、JSファイルドライブ):ちょうど私の地元のQ上に保存され、次のように
<html>
<head>
<script src="./jquery-2.2.2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="output"></div>
<div id="output2"></div>
<script language="javascript">
var url = "Q:\TestService.js";
var script = document.createElement("script");
script.setAttribute("src", url);
script.setAttribute("type", "text/javascript");
document.body.appendChild(script);
</script>
</body>
</html>
TestService.jsがある(ことに注意のSer vice.Legalは、OracleServiceが定義されているネームスペースです。MyServerは、サービスをデプロイしたサーバーの名前です。デバッガで実行している場合、myserverが "ローカルホスト:ポート番号" に変更され、これは[OK]を作品)
var url = "http://MyServer/Service.Legal.OracleWebService/OracleService.svc/GetData/1";
url += "?" + new Date().getTime().toString(); //append time to prevent caching
var script = document.createElement("script");
script.setAttribute("src", url);
script.setAttribute("type", "text/javascript");
document.body.appendChild(script);
function ServiceCallback(data) {
console.log("got data: ");
console.dir(data);
var result = data;
var date = new Date(parseInt(result.INVOICE_DATE.substr(6)));
var output = "<ul>";
output += "<li>INVOICE DATE: " + date + "</li>";
output += "<li>TOTAL EXCL GST: " + result.TOTAL_EXCL_GST + "</li>";
output += "<li>FEE ESTIMATE: " + result.FEE_ESTIMATE + "</li>";
output += "</ul>";
$("#output").html(output);
}
は最後に、web.configファイルは次のようになります。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Windows" />
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpBinding" crossDomainScriptAccessEnabled="true">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</webHttpBinding>
</bindings>
<client />
<services>
<service name="Service.Legal.OracleWebService.OracleService">
<endpoint address="" binding="webHttpBinding" contract="Service.Legal.OracleWebService.IOracleService" behaviorConfiguration="webBehaviour" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://MyServer/Service.Legal.OracleWebService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true" />
<directoryBrowse enabled="true" />
<httpErrors errorMode="Detailed" />
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
</configuration>
上で述べたように、Visual Studioのデバッガでこのサービスを実行すると、HTMLページでTestService.jsのjavascriptが実行され、javascriptが私のサービス(http://localhost:15021/OracleService.svc/GetMatter/matterId/ServiceCallback)を呼び出すと、期待されるデータが表示されますページ。私は、サーバー(http://MyServer/Service.Legal.OracleWebService/OracleService.svc/GetMatter/matterId/ServiceCallback)を指すように、そのサービスのURLを変更する場合
、私は空白のページを取得し、フィドラーは、ブラウザで直接エラー400
に、Webサービスの基本的なテストを与える要求を示して
期待されているjsonデータを返します(ただし、「1.json」を開くか保存するかはブラウザが何も表示しないことを明示しています)。サービス自体はアクセス可能に見えますIISで正常に動作しています。私のGetMatter関数や、それがサーバー上で動作するのを妨げているような方法で間違っているようです。