Hello Arjan,
Thank you for sharing the reproduction code.
I have tested this and the following non-Telerik related code has the same issue:
<input type="text" name="hostname" id="hostname" value="LOCALHOST:63527" />
<button type="button" onclick="OnClientClicked()">Make a Request</button>
<script>
function OnClientClicked() {
var params = {
"context": {
"Text": "",
"NumberOfItems": 0,
"FilterString": ""
}
}
var url = "http://" + document.getElementById("hostname").value + "/WEBSERVICE1.asmx";
Sys.Net.WebServiceProxy.invoke(url, "LoadAutoCompleteNodesComboBox", true, params,
function success() {
console.log("success");
alert("success")
console.log(arguments)
}, function error() {
console.log("error");
alert("error")
console.log(arguments)
}, "");
}
</script>
It seems in some cases the hostname is case sensitive, although the documentation does not explicitly say it can be only lowercase:
To be absolutely correct, the issue stems from the way how the MSAJAX framework works and how it determines if the request is a JSONP or not.
Below you can find the beginning of the Sys.Net.WebServiceProxy.invoke function:
Sys.Net.WebServiceProxy.invoke = function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, timeout, enableJsonp, jsonpCallbackParameter) {
/// <summary locid="M:J#Sys.Net.WebServiceProxy.invoke" />
/// <param name="servicePath" type="String"></param>
/// <param name="methodName" type="String" mayBeNull="true" optional="true"></param>
/// <param name="useGet" type="Boolean" optional="true"></param>
/// <param name="params" mayBeNull="true" optional="true"></param>
/// <param name="onSuccess" type="Function" mayBeNull="true" optional="true"></param>
/// <param name="onFailure" type="Function" mayBeNull="true" optional="true"></param>
/// <param name="userContext" mayBeNull="true" optional="true"></param>
/// <param name="timeout" type="Number" optional="true"></param>
/// <param name="enableJsonp" type="Boolean" optional="true" mayBeNull="true"></param>
/// <param name="jsonpCallbackParameter" type="String" optional="true" mayBeNull="true"></param>
/// <returns type="Sys.Net.WebRequest" mayBeNull="true"></returns>
var e = Function._validateParams(arguments, [
{ name: "servicePath", type: String },
{ name: "methodName", type: String, mayBeNull: true, optional: true },
{ name: "useGet", type: Boolean, optional: true },
{ name: "params", mayBeNull: true, optional: true },
{ name: "onSuccess", type: Function, mayBeNull: true, optional: true },
{ name: "onFailure", type: Function, mayBeNull: true, optional: true },
{ name: "userContext", mayBeNull: true, optional: true },
{ name: "timeout", type: Number, optional: true },
{ name: "enableJsonp", type: Boolean, mayBeNull: true, optional: true },
{ name: "jsonpCallbackParameter", type: String, mayBeNull: true, optional: true }
]);
if (e) throw e;
var schemeHost = (enableJsonp !== false) ? Sys.Net.WebServiceProxy._xdomain.exec(servicePath) : null,
tempCallback, jsonp = schemeHost && (schemeHost.length === 3) &&
((schemeHost[1] !== location.protocol) || (schemeHost[2] !== location.host));
useGet = jsonp || useGet;
if (jsonp) {
jsonpCallbackParameter = jsonpCallbackParameter || "callback";
tempCallback = "_jsonp" + Sys._jsonp++;
}
In the highlighted area the schemeHost[2] is "LOCALHOST:63527" while location.host is "localhost:63527". Comparing the two strings returns false and the MSAJAX framework assumes this is a JSONP request and invokes the wrong request.
With that said, you can choose one of the following approaches:
1) Use lowercase hostnames. The method name is case insensitive.
2) Override the get_path method of the WebServiceSettings to return a lowercase path by placing the following script under the script manager
Telerik.Web.UI.WebServiceSettings.prototype.get_path = function () {
return this._path.toLowerCase();
}
3) Override the MSAJAX framework's Sys.Net.WebServiceProxy.invoke method to take into account the case when validating:
Regards,
Peter Milchev
Progress Telerik