NopCommerceプラグインにあるWCFサービスを呼び出すphonegapアプリを1つ作成しました。
APIリクエストの送信中に次のエラーが発生します:
クロスオリジンリクエストがブロックされました:同一生成元ポリシーにより、 http://testwebsite.com/Plugins/NopRestApi/RemoteService/WebService.svc/GetData のリモートリソースの読み取りが禁止されています。 (理由:CORSプリフライトチャネルが成功しませんでした)。
クロスオリジンリクエストがブロックされました:同一生成元ポリシーにより、 http://testwebsite.com/Plugins/NopRestApi/RemoteService/WebService.svc/GetData のリモートリソースの読み取りが禁止されています。 (理由:CORSリクエストが失敗しました)。
Ajaxを使用したAPI呼び出し
$.ajax({
crossDomain: true,
type: "POST",
contentType: "application/json",
async: false,
url: "http://testwebsite.com/Plugins/NopRestApi/RemoteService/WebService.svc/GetData",
data: "{storeId:" + storeId + ", languageId:" + languageId + ", customerId:" + customerId + "}",
//data: { storeId: storeId, languageId: languageId, customerId: customerId },
dataType: 'json',
//jsonp: false,
success: function (data) {
alert(data.d);
},
error: function (xhr, textStatus, error) {
alert("Error! " + error);
}
});
私はグーグルのいくつかの研究によって私のWeb.configファイルに以下を追加しました。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
次のようにして、ブラウザのクロスオリジンリクエストチェックを無効にしても、さまざまな方法を試しました テストのために最新のブラウザでXSS保護を一時的に無効にする方法は? リンクですが、同じ問題が解決しません。
誰かが同様の問題を抱えて解決しましたか?
ありがとう!
Global.asaxの場合:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Fires at the beginning of each request
If Request.HttpMethod = "OPTIONS" Then
Response.Flush()
End If
End Sub
また、web.config showのallowメソッドは、オプションも追加します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000000" />
</appSettings>
<connectionStrings/>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5.1"/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
<namespaces>
<clear/>
<add namespace="System"/>
<add namespace="System.Collections"/>
<add namespace="System.Collections.Specialized"/>
<add namespace="System.Configuration"/>
<add namespace="System.Text"/>
<add namespace="System.Text.RegularExpressions"/>
<add namespace="System.Web"/>
<add namespace="System.Web.Caching"/>
<add namespace="System.Web.SessionState"/>
<add namespace="System.Web.Security"/>
<add namespace="System.Web.Profile"/>
<add namespace="System.Web.UI"/>
<add namespace="System.Web.UI.WebControls"/>
<add namespace="System.Web.UI.WebControls.WebParts"/>
<add namespace="System.Web.UI.HtmlControls"/>
</namespaces>
</pages>
<authentication mode="Windows"/>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
<system.webServer>
<staticContent>
<mimeMap fileExtension=".apk" mimeType="application/octet-stream"/>
</staticContent>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="POST,OPTIONS,GET"/>
<add name="Access-Control-Allow-Headers" value="Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With, Accept"/>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Cors" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="4000000" />
</webServices>
</scripting>
</system.web.extensions>
</configuration>
Global.asaxがVB cuz私はVBの人です、C#に変換できると思います。
リクエストに応じて、次のように更新します。
function funCheckWS() {
var tblLogin = {};
tblLogin.strLoginName = "UserName";
tblLogin.strPassword = "123456";
jQuery.support.cors = true;
$.ajax({
type: 'POST',
url: 'http://www.example.com/wsMain.asmx/funCheckWS',
data: "{tblLogin:" + JSON.stringify(tblLogin) + "}",
contentType: 'application/json; charset=utf-8',
dataType: 'json',
crossDomain: true,
// async: false,
async: true,
success: function (r) {
// Browser support WS
gloBolWS = true;
// alert("funCheck: " + r.d.strPassword);
},
error: function (xhr, ajaxOptions, thrownError) {
// Browser does not support WS
//alert(xhr.status);
//alert(thrownError);
}
});
}
以下はVBのWebサービスです(clsSQLはVBで記述されたクラスであり、すべてのバックエンドビジネスロジックの関数を含み、SQLサーバーにアクセスできます) ::
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Web.Script.Serialization
Imports System.Web.Script.Services
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class wsMain
Inherits System.Web.Services.WebService
Private clsSQL As New wxdlSQL.clsSQL()
Private tblLogin As tabLogin
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Function funCheckWS(tblLogin As tabLogin) As tabLogin
tblLogin.strLoginName += "Hello World"
Return tblLogin
End Function
End Class
以下は、パラメーターのデータ型を定義する方法です。
Public Class tabLogin
Private _loginname As String
Public Property strLoginName As String
Get
Return _loginname
End Get
Set(ByVal value As String)
_loginname = value
End Set
End Property
Private _password As String
Public Property strPassword As String
Get
Return _password
End Get
Set(ByVal value As String)
_password = value
End Set
End Property
End Class
WCFサービスからのクロスドメイン要求を許可する必要があります。
Response.AppendHeader("Access-Control-Allow-Origin", "*");
これを関数に追加しますが、データが関数から戻る前に追加します。
asp.netで「Access-Control-Allow-Origin」ヘッダーを実装する方法 が役立つ場合があります。
あなたのGlobal.asax
、次のコードを追加します。
protected void Application_AuthenticateRequest(object sender, EventArgs e){
Response.AddHeader("Access-Control-Allow-Origin", "*");
if (Context.Request.HttpMethod.Equals("OPTIONS")){
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
Context.ApplicationInstance.CompleteRequest();
}
}
それはうまくいくはずです