C# {quot;d";:null}在来自ASMX Web服务的JSON响应之后显示

C# {quot;d";:null}在来自ASMX Web服务的JSON响应之后显示,c#,asp.net,json,web-services,asmx,C#,Asp.net,Json,Web Services,Asmx,我一直在搜索和阅读,并尝试了许多不同的变体,以确保讨厌的{“d”:null}不会附加到我的JSON响应的末尾,但是,我不知所措。我有一个.asmx web服务,它使用Context.Response.Write方法,如下所示: DataTable products = my_source; string jsonResponse = JsonConvert.SerializeObject(products);//, Formatting.None, new JsonSerializerSett

我一直在搜索和阅读,并尝试了许多不同的变体,以确保讨厌的{“d”:null}不会附加到我的JSON响应的末尾,但是,我不知所措。我有一个.asmx web服务,它使用Context.Response.Write方法,如下所示:

DataTable products = my_source;

string jsonResponse = JsonConvert.SerializeObject(products);//, Formatting.None, new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore} );

this.Context.Response.Clear();
this.Context.Response.ContentType = "application/json; charset=utf-8";

this.Context.Response.Write(jsonResponse);
HttpContext.Current.ApplicationInstance.CompleteRequest();
我也尝试在写入之后使用Flush(),但没有成功。这将只返回JSON,但也会出现一个错误,即发送头后无法刷新。我使用了Write.End()而不是CompleteRequest,这也会截断JSON响应中的]值。我不使用Context.Response.Write,而是返回一个字符串,不过,这也会在JSON响应的末尾去掉]括号

我的方法属性如下所示:

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
我通过一个简单的ajax请求调用服务:

$.ajax({
    url : '/ProductCatalog/ProductMasterWS.asmx/GetProducts',
    type : 'GET',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (data) {
        populate(data);
    },
    error: function(xhr, ajaxOptions, thrownError) {
        console.log(xhr.status + " " + thrownError.stack);
    }
});

非常感谢您的任何想法/建议

不要这样实现web服务,只需返回一个包含web方法响应的POCO对象即可。ASMX会为您处理其余的问题。

请在服务器端尝试以下解决方案:

[WebMethod]
public void Select()
{
    String result = String.Empty;
    List<UserRole> userRoles = new UserRoleController().Select(new UserRole());
    JavaScriptSerializer js = new JavaScriptSerializer();
    result = js.Serialize(userRoles);

    Context.Response.Clear();
    Context.Response.ContentType = "application/json; charset=utf-8";
    Context.Response.Write(result);
}
[WebMethod]
公共作废选择()
{
字符串结果=String.Empty;
List userRoles=new UserRoleController()。选择(new UserRole());
JavaScriptSerializer js=新的JavaScriptSerializer();
result=js.Serialize(userRoles);
Context.Response.Clear();
Context.Response.ContentType=“application/json;charset=utf-8”;
Context.Response.Write(结果);
}

我知道这是一个非常老的问题,但我在使用IIS时遇到了同样的问题(在Visual Studio中调试时不会在响应中添加“d”:null)

在我的例子中,我通过修改应用程序池解决了这个问题。默认情况下,新站点会创建一个使用.NET CLR v4.0.30319的新应用程序池(我使用的是IIS v10.0.18362.1)


.NET CLR的版本应为v2.0.50727(集成模式)

当我返回字符串时,ASP.NET会自动在我的响应周围添加该字符串。我需要一个简单的JSON响应。我如何才能做到这一点?返回POCO对象怎么样?当您将响应设置为JSON时,它应该自动序列化。我尝试返回一个列表,但是,它没有序列化为JSON对象,并且使返回的内容更加复杂。“xmlns:xsd=”“xmlns=“…”。。。。。。