3

ajax を wcf サービスに接続しています。しかし、許可されていないメソッドを取得し続けます。何日もデバッグしています。そして、私はそれを理解していません。デフォルトの GetData(int value) メソッドでテストしています。

アヤックス:

    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript">
   $.ajax({
            type: "POST",
            url: "http://localhost:19478/Service1.svc/GetData",
            data: JSON.stringify({"value": "test"}),
            contentType: "application/json; charset=utf-8",
            dataType: "jsonp",
             success: function (msg) {
                        alert(msg);
                    },
         error: function (msg) {
                        alert("Failed");
                    }
        });

        function OnSuccessCall(response) {
            alert(response);
        }


        function OnErrorCall(response) {
            alert(response.status + " " + response.statusText);
        }

        </script>

web.config:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>





    <services>
      <service name="WcfServiceTest.Service1" behaviorConfiguration="myServiceBehavior">
        <endpoint name="webHttpBinding"
                  address="" binding="webHttpBinding"
                  contract="WcfServiceTest.IService1"
                  behaviorConfiguration="webHttp"
                  >
        </endpoint>
        <endpoint name="mexHttpBinding"
                  address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  />
      </service>
    </services>






    <behaviors>

      <serviceBehaviors>
        <behavior name="myServiceBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior>

          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>


      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>

        <behavior name="NewBehavior0">
          <webHttp helpEnabled="true"/>

        </behavior>
      </endpointBehaviors>

    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Iservice1:

 [OperationContract]
        [WebInvoke(Method="POST",
        RequestFormat=WebMessageFormat.Json,
        ResponseFormat=WebMessageFormat.Json)]
        string GetData(String value);

サービス1:

public string GetData(String value)
        {
            return string.Format("You entered: {0}", value);
        }

上には何もありませんpublic class Service1 : IService1。上があり[ServiceContract]ますpublic interface IService1

私は非常に多くのものを追加し、非常に多くのものを削除しました.. もうわかりません。私はそれが私のweb.configファイルであると思われますが、その部分はわかりません

4

2 に答える 2

3

オペレーション コントラクトは post メソッドであることを示していますが、リクエストJSONPのみをサポートする としてGetリクエストしています。クロス ドメイン リクエストでない場合は、JSONP を使用する必要はありませんPost。リクエストと同じようにメソッドを設定し、タイプを削除します。また、レスポンス フォーマットは JSON オブジェクトではありません。必要に応じて、コントラクトを変更するか変更することで、必要に応じて変更します。メソッドの戻りデータであり、それが機能するはずです。

コメントの編集:

まず、JSONP は実際の xmlhttprequest オブジェクト リクエストではありません。それがしていることは、要求データをパラメーターとして持つコールバック関数を持つスクリプトタグをページに追加することです。主にクロスドメインのデータ共有を対象としていました。JSONP リクエストは以下のようなものを返します

リクエスト URL : domain.com/getJsonp?callback=processJSONP

戻ります。

processJSONP( {
   resultList: [{data: "hello"}, 
                {data: "world"}
   // and lost of data you need.
   ]
});

processJSONP に注目してください。これは、ページまたはライブラリ内の関数であり、必要なことを何でも実行できます。

function processJSONP(jsonpResult) {
   for(var key in jsonpResult.resultList)
   {
      //process the data
   }
}

どうしても POST でデータを取得する必要がある場合は、JSONP にすることはできません。これは AJAX リクエストである必要があり、同じドメイン内にある必要があります。この場合、AJAX リクエストの成功関数でデータを処理できます。

于 2012-11-20T10:05:34.103 に答える
0

大丈夫、2日後、私はそれを修正しました。

これが私の手順です。貢献してくれたすべての人に感謝します。

  1. IService インターフェイスで、これを webinvoke に追加しました。

    BodyStyle = WebMessageBodyStyle.WrappedRequest

  2. データ型を jsonp から json に変更しました。jsonp は GET のみをサポートします (Onur TOPAL のおかげです)。

  3. Visual Studio プロジェクト フォルダーに ajax/json ファイルを配置しました。これにより、IIS サーバーで実行されます。

于 2012-11-20T12:53:27.330 に答える