繁体   English   中英

jQuery Ajax调用C#Web服务错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM