2016-04-13 4 views
0

クロスドメインコール(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関数や、それがサーバー上で動作するのを妨げているような方法で間違っているようです。

答えて

0

Hmmいいえ、私は間違った問題を見ていたと思います。

400(悪い要求)エラーは、問題が私のWebサービスへの呼び出しにあったと思いました。しかし、私のWebサービスが他のWebサービスを呼び出そうとすると、実際にサーバー側で問題が発生しているようです。私が他のWebサービスにその呼び出しを取り出したとき、私のサービスは代わりに200(成功)を返しました。私は(上に掲載されているように)私が得たものはOKで、その問題は他のWebサービスへの呼び出しと関係があるという前提で作業するつもりです。おそらく、私のサーバーからそのサーバーへの呼び出しを妨げているファイアウォールの問題ですが、開発マシンから同じサーバーへの呼び出しを許可します。

関連する問題