Я пытаюсь протестировать вызовы веб-службы, используя страницу ASP.NET, которая создает форму с полями имени пользователя и пароля и кнопкой «Отправить». (И jQuery, и файл .js, которые я использую, включены в теги script в элементе head.)
Кнопка «Отправить» вызывает функцию, созданную в файле кода C#, которая вызывает отдельный файл JavaScript.
protected void mSubmit_Click(object sender, EventArgs eventArgs)
{
String authenticate = String.Format("Authentication(\"{0}\",\"{1}\");", this.mUsername.Text,this.mPassword.Text);
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", authenticate, true);
}
Функция JavaScript, Authenticate
, делает вызов веб-службы, используя jQuery и Ajax, на другой сервер, отправляя параметры JSON и ожидая ответа JSON.
function Authentication(uname, pwd) {
//gets search parameters and puts them in json format
var params = '{"Header":{"AuthToken":null,"ProductID":"NOR","SessToken":null,"Version":1},"ReturnAuthentication":true,"Password":"' + pwd + '","Username":"' + uname + '",”ReturnCredentials”:false }';
var xmlhttp = $.ajax({
async: false,
type: "POST",
url: 'https://myHost.com/V1/Identity/Authenticate',
data: params,
contentType: 'application/json'
});
alert(xmlhttp.statusText);
alert(xmlhttp.responseText);
return;
}
Однако, поскольку веб-служба, которую я вызываю, находится на сервере, отличном от сервера ASP.NET, C# и JavaScript, я не получаю предупреждение statusText
или responseText
.
Почему-то ничего не отправляется в веб-службу, и я ничего не получаю обратно, даже ошибки. Я попытался поместить функцию в атрибут beforeSend
, но это не сработало. Есть ли какой-то особый способ обращения с внешним веб-сервисом?
ОБНОВЛЕНИЕ!
По совету jjnguy, Джени и Натана я сейчас пытаюсь вызвать веб-службу на стороне сервера, используя HttpWebRequest. Используя часть кода jjnguy, а также код из этот вопрос, я придумал это.
public static void Authenticate(string pwd, string uname)
{
string ret = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://myhost.com/V1/Identity/Authenticate");
request.ContentType = "application/json";
request.Method = "POST";
string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":false }'";
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data);
request.ContentLength = byteData.Length;
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (response)
{
// Get the response stream
StreamReader reader = new StreamReader(response.GetResponseStream());
// Console application output
ret = reader.ReadToEnd();
}
Console.WriteLine(ret);
}
Однако я получаю сообщение об ошибке (400) Bad Request
с удаленного сервера, когда пытаюсь получить ответ от моего HttpWebRequest. Значение свойства Response исключения равно {System.Net.HttpWebResponse}
, а значение свойства Status равно ProtocolError
. Я почти уверен, что это потому, что URL-адрес использует протокол HTTP SSL. Что я могу сделать, чтобы обойти это, кроме того, что URL-адрес страницы ASP.NET начинается с HTTPS (не вариант)?