3

ローカル マシンから Web サービスを呼び出そうとしています。しかし、Chrome コンソールで次のエラーが表示されます。
http://www.test.com/service.svc/api/?cid=1 405 (Method Not Allowed) XMLHttpRequest cannot load http://www.test.com/service.svc/api/?cid=1.
Origin http://localhost is not allowed by Access-Control-Allow-Origin.

私のローカル テスト URL は次のとおりです。 http://localhost/welcome/html/index.html

コードを実際のドメインにアップロードし、そこから Web サービスを呼び出すと、もちろん機能します。

私はすでにアクセス制御ヘッダーを変更しようとしましたが、それは役に立ちません。

Namespace RestService

Public Class service
    Implements Iservice

    Public Function GetProvinces(ByVal cid As String) As AjaxControlToolkit.CascadingDropDownNameValue() Implements Iweddingservice.GetProvinces
        WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS")
        WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*")

        Dim MyConnection As SqlConnection = GetConnection()
        Dim cmd As New SqlCommand("SELECT provinceid,title FROM provinces WHERE CountryID=@CountryID ORDER BY title ASC", MyConnection)
        cmd.Parameters.Add(New SqlParameter("@CountryID", cid))
        Dim values As New List(Of CascadingDropDownNameValue)
        Try
            MyConnection.Open()
            Dim reader As SqlDataReader = cmd.ExecuteReader
            While reader.Read
                values.Add(New CascadingDropDownNameValue(reader("title").ToString, reader("provinceid").ToString))
            End While
        Catch ex As Exception

        Finally
            MyConnection.Close()
        End Try
        Return values.ToArray
    End Function

End Class


End Namespace       
4

1 に答える 1

10

ブラウザの同一生成元ポリシーにより、サービスへのリクエストが失敗しています。http://www.test.com/http://localhostのリソースにアクセスしようとしている間、ローカル サーバーは にあります。これらは両方とも異なるドメインにあります。だからうまくいかない。

この問題の解決策は、 CORS仕様の一部であるAccess-Control-Allow-Originandを使用することです。これらを応答ヘッダーに含めましたが、呼び出しが許可されているかどうかを確認するためにブラウザーが OPTIONS 動詞を使用してプリフライト要求を行うため、これは役に立ちません。サービスが OPTIONS 動詞を処理できないため、405 (メソッドが許可されていません) エラーが表示されます。Access-Control-Allow-Methods

そのため、別のドメインからサービスにアクセスできるようにする場合は、CORS をサポートするように WCF サービスを変更する必要があります。このリンクをお勧めします: http://blogs.microsoft.co.il/blogs/idof/archive/2011/07/02/cross-origin-resource-sharing-cors-and-wcf.aspx。これを使用することで、既存のコードを変更することなく、サービスが CORS をサポートするようにすることができます。

于 2012-07-23T04:59:43.973 に答える