从jQuery到ASP.NET Web服务的跨域GET请求失败

时间:2013-09-12 14:42:01

标签: asp.net web-services jquery cross-domain

我正在尝试从jQuery ajax了解对Web服务的跨域调用。我在一个项目中运行了一个Web服务,在另一个项目中运行了一个简单的ASP.NET Web应用程序。

网络服务代码 -

    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public string HelloWorld()
    {
        string json = "Hello World";

        string jsoncallback = HttpContext.Current.Request["callback"];
        if (string.IsNullOrWhiteSpace(jsoncallback))
        {
            return json;
        }
        else
        {
            return string.Format("{0}({1})", jsoncallback, json);
        }

    }

从页面调用Web服务 -

    $(function () {
        $("#btnCall").click(function () {
            var urlToCall = "http://localhost:55172/SampleWebService.asmx/HelloWorld";
            $.ajax({
                url: urlToCall,
                type: "GET",
                dataType: "jsonp",
                contentType: "application/javascript",
                jsonpCallback: "MyFunc",
                error: function () {
                    console.log("Error!");
                },
                success: function () {
                    console.log("Success!!");
                }
            });
            return false;
        });
        function MyFunc() {
            console.log("Callback fired!");
        }
    });

正如您所看到的,我点击按钮即可调用Web服务。但是这个电话没有说,

Request format is unrecognized for URL unexpectedly ending in '/HelloWorld'. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/HelloWorld'.

如果我将以下内容添加到我的web.config -

,则会解决此问题
<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

但是,如果我这样做,无论我做什么,我的数据总是以XML格式返回。我需要有效JSON格式的数据,我该怎么做?

另请注意,我可以从同一项目中的aspx页面调用此Web服务,这似乎工作得很好。

1 个答案:

答案 0 :(得分:1)

您需要使用自定义代码序列化服务输出。 这些链接可以帮助您: