I've created one phonegap app where I'm calling WCF service which resides in nopCommerce plugin.
I'm getting following error while sending api request:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://testwebsite.com/Plugins/NopRestApi/RemoteService/WebService.svc/GetData. (Reason: CORS preflight channel did not succeed).
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://testwebsite.com/Plugins/NopRestApi/RemoteService/WebService.svc/GetData. (Reason: CORS request failed).
API call using Ajax
$.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);
}
});
I've added following in my Web.config file by some research on google.
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
I've tried many ways even disabled browser cross origin request check by following How to temporarily disable XSS protection in modern browsers for testing? link but still same issue persist.
Does anyone have similar issue and resolved?
Thanks!
In 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
And the allow method in web.config show add OPTIONS too.
<?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>
Sorry that the global.asax is in VB cuz I'm a VB guy, I think you can convert it to C#.
Per your request, update as follow:
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);
}
});
}
Below is my web services in VB (the clsSQL is a Class written in VB that contains functions of all my backend business logics and can access the sql server):
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
Below is how I define data type for the parameters:
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