1

我想做一个简单的 $.ajax POST 到我的 asp.net Webservice,返回 Json。我已经尝试了所有可能的解决方案,但没有任何运气。我错过了什么吗?

我的 jQuery 代码:

$.ajax({
    type: "POST",
    url: "/Services/ConfiguratorService.asmx/GetInitialJson",
    contentType: "application/json; charset=utf-8",
    data: "{}",
    dataType: "json",
    success: function (data, textStatus, jqXhr) {
        if (data != null) {
            alert(data.d);
        } else {
            alert("data undefined: | " + jqXhr + " | " + textStatus);
        }
    },
    error: function (jqXhr, textStatus, errorThrown) {
        alert(jqXhr + " | " + textStatus + " | " + errorThrown);
    }
});

我的 asmx.cs 代码:

[WebMethod(Description = "Gets initial configuration values for Configurator")]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public ConfiguratorModel GetInitialModel()
{
    return new Item { Title: "10 units", Text: "Item text..." };
}
public class Item { public string Title {get; set;} public string Text {get; set;} }

更新 1:在我的解决方案中,我得到了回复,但只是作为 XML。我试图在一个新的解决方案中重现该错误,但没有运气。一切正常。新旧解决方案中的 .asmx 服务实际上返回相同的响应。唯一的区别是其中一个中的 jquery 失败并出现错误:parsererror, unexpected token <

更新 2:我的旧解决方案中的响应标头始终是“text/xml; charset=utf-8”。

更新 3:我的 web.config 包含所有必需的条目。响应仍然是“text/xml;charset=utf-8”。为什么?

4

3 回答 3

1

我的一个同事帮我指出了方向。我发现处理程序是 asp.net 2.0。今年早些时候,该解决方案从 2.0 升级到了 4.0。我所要做的就是更换:

<add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHadlerFactory, System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode" responseBufferLimit="4194304" />

和:

<add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />

好主意是尝试暂时删除所有处理程序,仅添加:

<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
于 2013-06-25T12:26:48.970 回答
0

使用static关键字来调用方法,就像定义静态方法一样

public static ConfiguratorModel GetInitialModel()
{
    return new Item { Title: "10 units", Text: "Item text..." };
}
于 2013-06-21T13:06:05.517 回答
0

我有这样的网络服务:

[WebService(Namespace = "http://example.com/")]
[System.Web.Script.Services.ScriptService]
public class api : System.Web.Services.WebService {
    [WebMethod(EnableSession = true)]
    public ServiceResponse<string> SignIn(string _email, string _password) {...}
}

和 $.ajax 像你一样打电话。一切对我来说都很好。可能您需要添加[System.Web.Script.Services.ScriptService]到您的服务类。据我记得,这是 JSON 响应的关键。jQuery 调用是这样的:

$.ajax({
      type: "POST",
      url: "/api.asmx/SignIn",
      dataType: "json",
      data: JSON.stringify({"_password": pwd,
                            "_email": email
                        }),
      contentType: 'application/json; charset=utf-8',
      success: function (res) { }
   });

编辑:

public ConfiguratorModel GetInitialModel()
{
    return new Item { Title: "10 units", Text: "Item text..." };
}

这个方法定义看起来不对。Item当返回类型为 时,我看不到您如何返回ConfiguratorModel。这必须在编译时失败。

于 2013-06-21T13:06:24.597 回答