19

この問題で頭がおかしくなる。私は 2 つのプロジェクトのソリューションを持っています。そのうちの 1 つは jquery ajax 呼び出しを使用した単純な古い html で、もう 1 つは WCF サービスです。HTML ページは、JSON 文字列を取得して表示目的で使用するために、WCF サービスに ajax 呼び出しを発行します。

問題は、デバッグ モードで実行するたびに、html ページと WCF の両方が異なるポートで開始されることです。そして、これにより、テストを実行するときにクロスオリジンの問題が発生しました(つまり、Firefoxで呼び出しタイプ= OPTIONSで405 Method Not Allowedエラーが発生しました)。ajax スクリプトの call メソッドをトリプル チェックすると、WCF サービスは同じ (GET) です。

Google で検索したのですが、拡張機能をインストールするか、IIS で何らかの構成を実行する必要があることがわかりました。1 つの例に従って、web.config に次の構成を追加しますが、機能しませんでした。

    <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="crossDomain" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="MobileService.webHttpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"  />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="MobileService.SimpleMemberInfo" behaviorConfiguration="MyServiceBehavior">
        <endpoint address="" binding="webHttpBinding" contract="MobileService.IMemberInfo" bindingConfiguration="crossDomain" behaviorConfiguration="MobileService.webHttpBehavior">
        </endpoint>
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
      </customHeaders>
    </httpProtocol>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
    </system.webServer>

この厄介な問題を解決する方法を知っている人はいますか?

編集:追加するために、VS Studio 2012に付属するIIS Expressでデバッグを実行しています

WCF コードを追加し、web.config を更新しました

[ServiceContract]
public interface IMemberInfo
{
    [WebInvoke(Method = "GET",
           BodyStyle = WebMessageBodyStyle.Wrapped,
           ResponseFormat = WebMessageFormat.Json
    )]
    [OperationContract]
    string GetMemberInfoById();
    // TODO: Add your service operations here
}

私のスクリプト:

$(document).ready(function () {
    $.ajax("http://localhost:32972/SimpleMemberInfo.svc/GetMemberInfoById", {
        cache: false,
        beforeSend: function (xhr) {
            $.mobile.showPageLoadingMsg();
        },
        complete: function () {
            $.mobile.hidePageLoadingMsg();
        },
        contentType: 'application/json',
        dataType: 'json',
        type: 'GET',
        error: function () {
            alert('Something awful happened');
        },
        success: function (data) {
            var s = "";

            s += "<li>" + data + "</li>";
            $("#myList").html(s);

        }
    });
});
4

5 に答える 5

11

クロスドメイン呼び出しに JSONP を使用してブラウザーの制限を回避し、web.configcrossDomainScriptAccessEnabledを true に設定して更新してサーバーの制限を回避する必要があります。ここの回答に良い例があります: wcf サービスを使用するために jquery ajax でクロス ドメイン ポリシーを回避する方法は?

GET 要求にも問題がある可能性があります。ここで概説されている修正を試してください: Make a WCF Web Service work with GET requests

全体として、次のような web.config が必要です。

<bindings>
  <webHttpBinding>
    <binding name="crossDomain" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>
<behaviors>
  <endpointBehavior>
    <behavior name="restBehavior">
      <webHttp />
    </behavior>
  </endpointBehavior>
  <serviceBehavior>         
     <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true"  />
        <serviceDebug includeExceptionDetailInFaults="true"/>
     </behavior>
  </serviceBehavior>
</behaviors>
<services>
  <service name="..." behaviorConfiguration="MyServiceBehavior">
    <endpoint address="" binding="webHttpBinding" bindingConfiguration="crossDomain" 
              contract="..." behaviorConfigurations="restBehavior" /> 
  </service>
</services>

(サービスとエンドポイントの両方にビヘイビアーが関連付けられており、それぞれ webHttp 呼び出しと httpGet 呼び出しを許可し、バインディングで crossDomain アクセスが明示的に有効になっていることに注意してください)。

... 次のように装飾されたサービス メソッド:

[ServiceContract]
public interface IMyService
{
    [WebGet] // Required Attribute to allow GET
    [OperationContract]
    string MyMethod(string MyParam);
}

... そして JSONP を使用したクライアント呼び出し:

<script type="text/javascript">
$(document).ready(function() {
    var url =  "...";
    $.getJSON(url + "?callback=?", null, function(result) { // Note crucial ?callback=?
       // Process result
    });
});
</script>
于 2012-11-05T09:39:20.837 に答える
3

私にとってうまくいったのは、IISのWCF関連機能を有効にすることでした: ここに画像の説明を入力

于 2021-02-02T14:45:10.217 に答える