使用jquery和jsonp的ASP.NET跨域Web服务调用错误

时间:2013-05-15 20:50:52

标签: javascript jquery asp.net web-services jsonp

我的问题与here描述的问题非常相似。

然而,在我的情况下,我在firebug中收到 500内部服务器错误

对于意外以“/ HelloWorld”结尾的网址无法识别请求格式。

我的asp.net 4.0网络服务调用是跨域的,并且从过去十几个其他网站的建议我相信我已经配置了所有内容以便允许这种情况正确发生,但显然我没有。我究竟做错了什么?

我使用的是JSONP而不是JSON。如果所有内容都在同一台服务器上,则Web服务按预期工作。我的问题是,调用Web服务的html页面的托管服务提供商不允许使用服务器端代码,否则我只是将所有内容放在一个地方并完成它!

下面是我的代码/标记:

的web.config:

<?xml version="1.0"?>
    <configuration>
  <system.webServer>
    <httpErrors errorMode="Detailed"></httpErrors>
    <asp scriptErrorSentToBrowser="true"></asp>
    <modules>
      <add name="ContentTypeHttpModule"
                    type="ContentTypeHttpModule.ContentTypeHttpModule, ContentTypeHttpModule" />
    </modules>
  </system.webServer>
  <system.web>
    <customErrors mode="Off"></customErrors>
    <compilation debug="true" targetFramework="4.0"/>
    <trust level="Full"/>
    <pages clientIDMode="Static"/>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
    <!--<httpModules>
      <add name="ContentTypeHttpModule"
                    type="ContentTypeHttpModule.ContentTypeHttpModule, ContentTypeHttpModule" />
    </httpModules>-->
  </system.web>
</configuration>

html文件javascript:

function test() {
            $.ajax({
                url: 'http://designonlinelettering.com/RenderImage.asmx/HelloWorld',
                data: {},
                contentType: "application/json; charset=utf-8",
                dataType: "jsonp",
                success: function (result) {
                    var data = result.d;
                    alert(data);
                },
                error: function (e) {
                    alert('error: ' + e.d);
                }
            });
        }

网络服务代码:

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

ContentTypeHttpModule 代码来自这个信息量很大的blog,我从中获得了大部分指示。

感谢您的帮助...

1 个答案:

答案 0 :(得分:1)

如上所述,如果您在浏览器中查看http://designonlinelettering.com/RenderImage.asmx/HelloWorld,则会看到错误。添加?callback = x没有帮助。它只会为正确设置数据/响应类型的POST请求返回JSON。

ASMX是有问题的,不会为GET请求返回JSON ...最好的办法是使用ASHX,而使用JSON的Response.Render(我建议使用JSON.Net作为编码器)。

...
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
...
  var ret = JsonConvert.SerializeObject(
    objectToReturn
    ,new IsoDateTimeConverter()
    ,new DataTableConverter()
    ,new DataSetConverter()
  );
  //only need the datatable, and dataset converters if you're returning those types

  //jsonp should have a callback on the querystring, in your jquery
  // request append  "pathto.ashx?callback=?"
  context.Response.ContentType = "application/javascript";
  context.Response.Write(string.format(
    "{0}({1});"
    ,context.Request.QueryString["callback"]
    ,ret
  ));
...