1

私は2つのサイトを持っています。

私もウェブサービスを持っています。

http://www.mydomain.com/trouwlocaties/zoeken-uitgebreidのカスケード ドロップダウンで国名を読み込むと、これが実際に動作しているのがわかります。

ただし、同じ Web サービスが次のエラーをスローします : http://otherdomain.com/weddingvenues/search-advanced、クライアントが .asmx サービスを取得しようとする場所で、toptrouwen で POST を使用します (これは、起こるはずのことであり、より安全であると私は信じています)。

これは GetCountries Web サービスです。

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<ToolboxItem(False)> _
Public Class geolocation
'<System.Web.Script.Services.ScriptService()> _
'<WebService(Namespace:="http://tempuri.org/")> _
'<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
'<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _


Inherits System.Web.Services.WebService

<WebMethod()> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
    Dim values As New List(Of CascadingDropDownNameValue)

    Dim myConnection As SqlConnection = GetConnection()
    Dim cmd As New SqlCommand(String.Format("SELECT id,name as title FROM country order by title asc", Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName), myConnection)
    Try
        myConnection.Open()
        Dim reader As SqlDataReader = cmd.ExecuteReader
        Dim CountryName As String
        Dim CountryID As Integer
        While reader.Read
            CountryName = reader("title").ToString
            Int32.TryParse(reader("id"), CountryID)
            values.Add(New CascadingDropDownNameValue(CountryName, CountryID.ToString))
        End While
    Catch ex As Exception

    Finally
        myConnection.Close()
    End Try

    Return values.ToArray
End Function

End Class   

まず、これをweb.configに追加してみました:

<system.web>
<webServices>
  <protocols>
    <remove name="Documentation"/>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>
</system.web>

それを行った後、Chrome コンソールでこれを受け取りました。

Uncaught SyntaxError: Unexpected token < 

どうやら結果はXMLとして解釈されなかったようですが、私の推測ではJSONです。Google で検索した結果、これは MIME タイプに関係していると思いましたが、このサービスの XML に変更する方法がわかりませんでした。

だから私は検索を続け、何か他のものを見つけました。私はこれらの投稿を読んでいまし :トークン < -- jQuery ajax で

どうやら「クロスドメインの問題」である可能性があります。

だから私はこれらのファイルを作成することになりました:

clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
<policy>
  <allow-from http-request-headers="*">
    <domain uri="*"/>
  </allow-from>
  <grant-to>
    <resource path="/" include-subpaths="true"/>
  </grant-to>
</policy>
  </cross-domain-access>
</access-policy>

crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<?xml version="1.0" ?> 
<cross-domain-policy>
    <allow-access-from domain="*" /> 
    <allow-access-from domain="*.otherdomain.com" secure="false" /> 
</cross-domain-policy>

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
            <binding name="GetCountries" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
                <security mode="None" />
            </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://www.mydomain.com/geolocation.asmx"
            binding="basicHttpBinding" name="GeoLocation" />
        </client>
    </system.serviceModel>
</configuration> 

最初のリンクの例では、ユーザーが属性 bindingConfiguration="DashboardServiceSoap" および contract="DashboardService.DashboardServiceSoap" も追加しましたが、私のケースではそこに何を入力する必要があるかわかりません。

私はまだ立ち往生しています。何が正しいトラックで、どのようにセットアップを構成すればよいかわかりません。

2013年6月21日更新

私のweb.configを次のように更新しました:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>

次の4つの構成も試しました。

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<ToolboxItem(False)> _
Public Class geolocation

    Inherits System.Web.Services.WebService

シナリオ 1 および 2 このメソッド定義では:

<WebMethod()> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue() 

シナリオ 1: web.config の WITH プロトコル セクション

<webServices>
  <protocols>
    <remove name="Documentation"/>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>  

.nl ドメインで正しく動作する .com ドメインでメソッド エラー -1 をスローします。Chrome コンソールの表示: Uncaught SyntaxError: Unexpected token < GetCountries:1

シナリオ 2: web.config のプロトコル セクションなし

.nl ドメインで正しく動作する .com ドメインでメソッド エラー -1 をスローします。Chrome コンソールの表示: GET http://www.otherdomain.com/geolocation.asmx/GetCountries?knownCategoryValues=%22%22&category=%22Country%22&callback=Sys._jsonp0 500 (内部サーバー エラー) ScriptResource.axd:7773

このメソッド定義を使用したシナリオ 3 および 4:

<WebMethod()> _
<ScriptMethod(UseHttpGet:=True, ResponseFormat:=System.ServiceModel.Web.WebMessageFormat.Json)> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue() 

シナリオ 3: web.config の WITH プロトコル セクション

<webServices>
  <protocols>
    <remove name="Documentation"/>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>  

.nl ドメインでメソッド エラー 500 をスローします。Chrome コンソールの表示: POST http://www.mydomain.com/geolocation.asmx/GetCountries 500 (内部サーバー エラー) catcher.js:197 ドロップダウンの .com ドメインでメソッド エラー -1 をスローします。Chrome コンソールの表示: Uncaught SyntaxError: Unexpected token < GetCountries:1

シナリオ 4: web.config のプロトコル セクションなし

.nl ドメインでメソッド エラー 500 をスローします。Chrome コンソールの表示: リソースの読み込みに失敗しました: サーバーは 500 のステータスで応答しました (内部サーバー エラー) ドロップダウンの .com ドメインでメソッド エラー -1 をスローします。Chrome コンソールの表示: GET http://www.otherdomain.com/geolocation.asmx/GetCountries?knownCategoryValues=%22%22&category=%22Country%22&callback=Sys._jsonp0 500 (内部サーバー エラー)

また、スクリプトから .asmx を明示的に呼び出しているわけではありません。カスケード ドロップダウンにその作業を任せています。そのようです:

<asp:DropDownList ID="ddlCountries" CssClass="textbox" AutoPostBack="true" runat="server"></asp:DropDownList>
<cc1:cascadingdropdown ID="cddCountries" runat="server" Category="Country" Enabled="True" LoadingText="<%$Resources:Glossary,loading %>" PromptText="<%$Resources:Glossary,country_choose %>" 
ServiceMethod="GetCountries" TargetControlID="ddlCountries">
</cc1:cascadingdropdown>

コードビハインド

cddCountries.ServicePath = "http://www.mydomain.com/geolocation.asmx"

これらの事前定義された要素を使用しているという事実が私の問題と関係があるかどうかはわかりません。自分でスクリプトを介して .asmx サービスを呼び出し、ドロップダウンに入力することをお勧めします。もしそうなら:私はそうする方法がわかりません。

4

1 に答える 1

1

これはクロスオリジンの問題であることは間違いありません。これを処理するには、いくつかの方法があります。

  1. Web サービスに送信する必要のあるデータがそれほど大きくない限り、Web サービスを JSONP に変換できます。ただし、サービスからのデータは、好きなだけ大きくすることができます。それほど大きくないため、約 2k 文字以下にする必要があります。script タグの src 属性から get 要求の一部として送信されることを知ることで、1 つの JSONP 要求で送信できるデータの量を計算できます。

    これは、すでによく知っているかもしれない JSONP に関する適切な SO の回答です。

    JSONP とは何ですか?

    アップデート

    VB.NET で JSONP を実行する例を次に示します。

    http://www.sattsoft.com/tutorials/contents/1/14/cross-domain-call-using-ajax-jquery-jsonp-and-vb-net-web-service.html

  2. www.wunderweddings.com のサブドメインを作成し、おそらく「api.www.wunderweddings.com」と呼び、DNS を使用して、A または CNAME レコードを使用してそのサブドメインを適切な場所にポイントします。次に、この新しい API ホストを指す小さな (目に見えない) iframe をクライアント側のページに埋め込みます (http/s に一致するように、src を「//api.www.underweddings.com」として指定してください)。含まれているページの)、iframe 内で javascript を使用してその document.domain を www.wunderweddings.com に昇格させます。これはスクリプト インジェクションによって行うことができますが、サーバー上のそのページにそれを実行するためのスクリプトを提供させる方が簡単です。 API を指す iframe と、www.wunderweddings.com にある iframe を含むページの間で自由に通信できます。

  3. クライアントで postMessage が常に利用可能であることがわかっている場合 (おそらくそうではありません)、document.domain を変更せずに上記を実行できます。

  4. 上記のポイント 2 と 3 は、おそらく面倒に思えます。特に、提供する Web サービスを拡大したり、そのサービスにアクセスするドメインの数を増やしたりする場合は。その場合、EasyXDM を使用することを強くお勧めします。これは、クライアント側のクロスドメイン RPC を実行するための素晴らしく強力なライブラリです。

    http://easyxdm.net/wp/

    EasyXDM は、ハッシュや name 属性を介した通信など、postMessage が利用できない場合にフォールバックを提供します。

  5. crossdomain.xml を修正できます。さて、ここで私は少し錆びていますが、私はあなたに私の最善の推測をします:

アップデート

crossdomain.xml を次のようにします。

<?xml version="1.0" ?> 
<cross-domain-policy>
    <allow-access-from domain="*" /> 
    <allow-access-from domain="*.wunderweddings.com" /> 
</cross-domain-policy>

"<cross-domain-policy>" の最初の子、つまり "<allow-access-from domain=" " />" は完全に無制限にしますが、"<allow-access-from domain=" .wunderweddings. com" />" は、wunderweddings.com とサブドメインのみがブラウザーによるクロスドメイン呼び出しを許可されるようにします。「allow-access-from」タグの両方は必要ありませんが、少なくとも 1 つ必要です。

なぜその構成がそこにあるのかわかりませんが、そうあるべきではありません。初めて、それがほぼ間違いなくあなたの問題であることに完全に気づきませんでした。また、crossdomain.xml が他のサーバー (Web サービスを備えたサーバー) から提供されていることを確認してください。

明確にするために、crossdomain.xml の下部に余分な XML、<onfiguration>...</configuration> タグ、およびその内部のすべてを含める必要はありません。 crossdomain.xml 内


最終更新

同様の問題を抱えているこの回答を読んでいる人のために、フローランは無効な文字の問題を発見しました:

これをページの上部に追加する必要がありました:

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> 
<Services> 
<asp:ServiceReference Path="geolocation.asmx" /> 
</Services> 
</asp:ScriptManagerProxy>

于 2013-06-20T12:28:39.920 に答える