我正在尝试使用 ASP.NET 页面来测试 Web 服务调用,该页面创建了一个包含用户名和密码字段以及“提交”按钮的表单。(我使用的 jQuery 和 .js 文件都包含在 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 对不同的服务器进行 Web 服务调用,发送 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;
}
但是,由于我调用的 Web 服务与 ASP.NET、C# 和 JavaScript 文件位于不同的服务器上,因此我没有收到statusText
警报responseText
。
不知何故,没有任何东西被发送到网络服务,我也没有得到任何回报,甚至没有错误。我尝试在属性中放置一个函数beforeSend
,但没有触发。我需要一种特殊的方式来处理调用服务器外 Web 服务吗?
更新!
在 jjnguy、Janie 和 Nathan 的建议下,我现在正在尝试使用 HttpWebRequest 对 Web 服务进行服务器端调用。使用 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 协议。除了让 ASP.NET 页面 URL 以 HTTPS 开头(不是一个选项)之外,我还能做些什么来解决这个问题?