【问题标题】:ASMX webservice not returning JSON, can only POST using application/x-www-form-urlencoded contentTypeASMX webservice 不返回 JSON,只能使用 application/x-www-form-urlencoded contentType POST
【发布时间】:2009-05-22 22:17:58
【问题描述】:

如果 contentType = "application/x-www-form-urlencoded; charset=utf-8",我可以使用 jQuery 调用我的网络服务

但是,这将返回 xml:<string>[myjson]</string>

如果我尝试使用“application/json; charset=utf-8” POST 到服务,我会收到一个 500 错误,其中包含空的 StackTrace 和 ExceptionType。我的网络服务功能从未被击中,所以我不太确定如何调试这种情况。

我的方法和类都用适当的属性修饰,并设置为使用 JSON 作为它们的响应类型(我的 wsdl 和 disco 文件也是如此)。我在 web.config 中安装了 Ajax 扩展和所需的条目。

这是在 SharePoint 场上,但我不确定这会产生多大的不同。我在所有 WFE 上部署了 web.config 更改,并安装了 ajax 扩展。该服务再次工作,它只接受默认内容类型以外的任何内容。

不知道我在这里错过了什么,伙计们......

我的 ajax 调用:

$.ajax({
type: "POST",
url: "/_vti_bin/calendar.asmx/Test",
dataType: "json",
data: "{}",
contentType: "application/json; charset=UTF-8",
success: function(msg){
    alert(msg);
    },
error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); }
});

我的网络服务类:

[WebService(Namespace = "http://namespace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class CalendarService : WebService
{
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string Test()
    {
        return "Hello World";
    }
}

【问题讨论】:

  • 在 ASP.NET MVC 1.0 上执行 AJAX 请求时也会发生同样的情况。

标签: c# jquery web-services sharepoint asmx


【解决方案1】:

我在 2.0 中使用 Web 服务进行了这项工作,但我已经对 .d 进行了保护(请参阅下面的 dataFilter)。我还返回了一个对象数组。注意:对象的类是静态的,或者至少对我来说不能正常工作。

  $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data)
        {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: "webservice/ModifierCodesService.asmx/GetModifierList",
        success: function(msg)
        {
            LoadModifiers(msg);
        },
        failure: function(msg)
        {
            $("#Result").text("Modifiers did not load");
        }
    });

这是我的网络服务的 sn-pt:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{

     /// <summary>
    /// Get a list of Modifiers
    /// </summary>
    /// <returns></returns>
    [WebMethod(EnableSession = true)]
    public Modifier[] GetModifierList()
    {
        return GetModifiers();
    }
       /// <summary>
        /// Modifiers list from database
        /// </summary>
        /// <returns></returns>
        private Modifier[] GetModifiers()
        {
            List<Modifier> modifier = new List<Modifier>();
            ModifierCollection matchingModifiers = ModifierList.GetModifierList();
            foreach (Modifier ModifierRow in matchingModifiers)
            {
                modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
            }
            return modifier.ToArray();
        }
    }

...

目标代码:

 public static class ModifierList
    {

        /// <summary>
        /// Returns the Modifier Collection.
        /// </summary>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static ModifierCollection GetModifierList()
        {

【讨论】:

  • 所以底线改变 public string Test() { 到 public static string Test() { 看看是否适合你。
【解决方案2】:

我今天一直在用一个 iPhone 应用程序与一个 .Net Web 服务通信来解决这个问题。

我发现,如果我将我的内容类型更改为 application/jsonrequest,它就会顺利通过,并且我能够在我的网络服务器中处理数据。

只是为了笑,我将上面提到的那行添加到我的 web.config 中,但它并没有使 application/json 工作。

【讨论】:

    【解决方案3】:

    不确定它是否会这么简单,但我正在使用 jQuery 从我的 Web 方法中回调 JSON。

    我看到的主要区别是类的属性

    [System.Web.Script.Services.ScriptService]

        [WebService(Namespace = "http://MyNameSpace")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.Web.Script.Services.ScriptService]
        public class Web : System.Web.Services.WebService{
    
           [WebMethod]
           public string TestMethod(){
             return "Testing";
           }
    
        }
    

    我必须假设您使用的是 3.5 框架,因为这是公开 JSON Web 方法的唯一方法。

    我的 jQuery 调用看起来几乎相同,所以没有问题。

    【讨论】:

      【解决方案4】:

      如果您在 IE 中对此进行测试,请尝试从您的 contentType 属性中删除字符集声明(即它应该如下所示:

      contentType: "application/json",
      

      我还没有找到原因,但在使用“charset=UTF-8”部分进行 JSON 调用时,IE 似乎有点扭曲。

      【讨论】:

        【解决方案5】:

        我认为您正在寻找 WebInvoke 或 WebGet 属性,它可以让您指定 Uri 模板、正文样式、请求和响应格式,例如:

        [WebGet(ResponseFormat= WebMessageFormat.Json)]
        

        This 链接可能会有所帮助。 WebInvoke 有一篇类似的文章(主要用于发布)。

        【讨论】:

        • 问题是关于 ASMX Web 服务; WebGet 适用于 WCF 合同。
        【解决方案6】:

        我经常使用 JQuery AJAX JSON 调用 ASMX 网络服务。它在所有浏览器中都能完美运行。我正在使用安装了 ASP.NET AJAX 扩展的 .NET 2.0(捆绑在 3.5 中)。

        我的班级和你们的装饰师一样。我的方法只有 [WebMethod(EnableSession = true)] 装饰器。但是,我的 web.config 在其 httpHandlers 部分中有以下条目:

        <add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        

        我的 jquery 调用如下所示:

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "path/to/service/jsonservice.asmx/MethodName",
            data: JSON.stringify(DTO),
            dataType: "json",
            success: function(rtrn) { alert("good"); },
            error: function(req, msg, err) { alert("bad"); }
        });
        

        This article是我知识的根源。

        【讨论】:

          【解决方案7】:

          看起来您必须在 scriptMethod 标记中指定 json 作为响应格式。这是来自 vb.net,但我相信你明白了:

          ResponseFormat:=ResponseFormat.Json

          【讨论】:

          • 正如您在粘贴的代码中看到的那样,我正在为 ScriptMethod 属性提供响应格式。
          猜你喜欢
          • 2014-03-30
          • 2017-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          相关资源
          最近更新 更多