Tôi đang cố gắng kiểm tra các cuộc gọi dịch vụ web bằng trang ASP.NET tạo biểu mẫu có tên người dùng và mật khẩu và nút "Gửi". (Cả jQuery và tệp .js tôi đang sử dụng được bao gồm trong các thẻ tập lệnh trong phần tử đầu.)Gọi dịch vụ web trên máy chủ bên ngoài từ javascript bằng asp.net và C#
Nút "Gửi" gọi hàm được tạo trong mã C# phía sau tệp thực hiện cuộc gọi đến một JavaScript riêng biệt tập tin.
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);
}
Các hàm JavaScript, Authenticate
, làm cho cuộc gọi dịch vụ web, sử dụng jQuery và Ajax, đến một máy chủ khác nhau, gửi thông số JSON và mong trở lại JSON trong phản ứng.
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;
}
Tuy nhiên, do các dịch vụ web tôi gọi là trên một máy chủ khác với ASP.NET, C# và các tập tin JavaScript, tôi không nhận được một statusText
hoặc responseText
cảnh báo.
Bằng cách nào đó, không có gì được gửi tới dịch vụ web và tôi không nhận được bất kỳ điều gì trở lại, thậm chí không phải là lỗi. Tôi đã thử đặt một hàm trong thuộc tính beforeSend
, nhưng điều đó không kích hoạt. Có cách nào đặc biệt mà tôi cần để xử lý việc gọi một dịch vụ web ngoài máy chủ không?
CẬP NHẬT!
Theo lời khuyên của jjnguy, Janie và Nathan, tôi hiện đang thử một cuộc gọi phía máy chủ với dịch vụ web bằng HttpWebRequest. Sử dụng một số mã của jjnguy cũng như mã số từ this question, tôi đã nghĩ ra điều này.
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);
}
Tuy nhiên, tôi nhận được lỗi (400) Bad Request
từ máy chủ từ xa khi tôi cố nhận phản hồi từ HttpWebRequest của mình. Giá trị của thuộc tính Response của ngoại lệ cho biết {System.Net.HttpWebResponse}
và giá trị của thuộc tính Trạng thái là ProtocolError
. Tôi khá chắc chắn điều này là do URL đang sử dụng giao thức HTTP SSL. Những gì tôi có thể làm để có được xung quanh đó, khác hơn là có URL trang ASP.NET bắt đầu với HTTPS (không phải là một lựa chọn)?
Đây là giải pháp phong cách Rube Goldberg, bạn sẽ cần phải đơn giản hóa rất nhiều. – Janie
Đồng ý. Tôi rất vui vì chúng tôi đang ở trên cùng một trang. – jjnguy
Bạn có thể xem dịch vụ từ trình duyệt không? – Janie