[英]Jquery Ajax call to C# Web Service Error
我试图使用jQuery对位于同一网站下的C#Web服务进行AJAX调用。 无论我发现/尝试什么,我都会不断收到这样的500错误:
Request format is unrecognized for URL unexpectedly ending in '/MyTest'.
网页上的jQuery AJAX调用
$.ajax({
type: "POST",
url: 'http://172.1.1.10/MYService/MyService.asmx/MyTest',
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data);
},
error: function (data, errorThrown) {
alert("Fail");
alert(errorThrown);
}
});
Web服务(MyService.asmx)后面的代码
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string MyTest()
{
return "Hello World";
}
是的,我在顶部没有评论以下内容:
[System.Web.Script.Services.ScriptService]
当我尝试加载网页时,出现警告窗口,显示“失败”。 这是我收到500错误的信息(请参阅帖子顶部)。
太多的人建议将其添加到Web服务的web.config中:
Web服务(Web.config)
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
添加后,我可以使用以下地址访问本地计算机:
http://172.1.1.10/MYService/MyService.asmx/MyTest
我得到了“ Hello World”的正确回应。 在添加此代码之前,我将在本地获得相同的500错误消息。
Web服务和网站都在IIS中相同网站下的同一IIS实例上设置,每个实例作为其自己的应用程序。 我知道这不是跨域问题,因为如果这是真的,我不会收到您通常会收到的503错误,也不会收到文件未找到的404错误。
我已经在网上搜寻过,似乎无法找到解决方法。
因为它说请求格式无法识别,所以您不需要在ajax调用中发送数据。尝试从ajax调用中删除数据字段数据:“ {}”,看看是否有效。只需使用:
$.ajax({
type: "POST",
url: 'http://172.1.1.10/MYService/MyService.asmx/MyTest',
dataType: "json",
success: function (data) {
alert(data);
},
error: function (data, errorThrown) {
alert("Fail");
alert(errorThrown);
}
});
多亏了nick_w,使用Chrome的控制台功能为我提供了以下错误:
XMLHttpRequest cannot load http://172.1.1.10/MYService/MyService.asmx/MyTest. Origin http://mydomain.mysitename.com is not allowed by Access-Control-Allow-Origin.
我发现当我浏览网站时,我使用的域名是:
http://mydomain.mysitename.com
而当我用代码调用Web服务时,我使用的是IP地址:
http://172.1.1.10
因此,从技术上讲,我遇到了跨域问题。 一旦我在IP地址访问了我的网站,或者将网络服务呼叫更改为:
http://mydomain.mysitename.com/MyService/MyService.asmx/MyTest
然后解决就好了。 我确实需要这样更新我的代码:
$.ajax({
type: "POST",
url: 'http://mydaomin.mysitename.com/MYService/MyService.asmx/MyTest',
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data.d);
},
error: function (data, errorThrown) {
alert("Fail");
alert(errorThrown);
}
});
注意,我在警报中添加了“ .d”,因为它返回的是“对象对象”而不是结果。
您可以在服务中添加全局类,并在Application_BeginRequest
函数中添加以下代码:
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.