0

我正在尝试使用 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.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 错误,也没有收到 File Not Found 的 404 错误。

我在网上搜索过,似乎找不到解决办法。

4

3 回答 3

0

由于它说请求格式无法识别,因此您不需要在 ajax 调用中发送数据。尝试从 ajax 调用中删除数据字段 data:"{}" 看看是否有效。只需使用:

     $.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);
    }
});
于 2012-11-20T20:01:57.787 回答
0

感谢 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 地址上访问了我的网站,或者将 web 服务调用更改为:

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”,因为它返回的是“对象对象”而不是结果。

于 2012-11-26T15:45:50.260 回答
0

您可以在服务中添加全局类并在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();
}
于 2014-11-27T07:32:19.210 回答