jQuery Asmx Web 服务返回 xml 而不是 json,试图从服务输出中删除 <string xmlns="http://tempuri.org/">
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10824471/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Asmx web service returning xml instead of json, Trying to remove <string xmlns="http://tempuri.org/"> from service output
提问by Shantanu Gupta
I have been looking for 100's of links for last 3 hours eg adding scriptfactory to webconfig, 3 mistakes, setting content type etc.
在过去的 3 个小时里,我一直在寻找 100 个链接,例如将 scriptfactory 添加到 webconfig、3 个错误、设置内容类型等。
I am not able to figure out what actually the mistake is.
我无法弄清楚实际上是什么错误。
Environment: Service running on .net 4.0 Web application running on .net 4.0
环境:在 .net 4.0 上运行的服务 在 .net 4.0 上运行的 Web 应用程序
Requirements: I need to bind a jqGrid with asmx web service that is returning me a json as a string. Web service file contains following code.
要求:我需要将 jqGrid 与 asmx Web 服务绑定,该服务将 json 作为字符串返回给我。 Web 服务文件包含以下代码。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class SampleService : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetJsonServerProcess()
{
int memory = 1;
string json = string.Empty;
var obj = (System.Diagnostics.Process.GetProcesses().Where(r => r.WorkingSet64 > memory).Select(p => new { p.ProcessName, p.WorkingSet64 }).ToArray());
json = Lib.ToJSON(obj);
return json;
}
}
Javascript is as follows
Javascript如下
<script type="text/javascript">
$(document).ready(function () {
jQuery("#jqgajax").jqGrid({
ajaxGridOptions: { type: "POST", contentType: 'application/json; charset=utf-8' },
url:'http://localhost:1092/SampleService.asmx/GetJsonServerProcess',
datatype: "json",
data: "{}",
colNames: ['ProcessName', 'WorkingSet64'],
colModel: [
{ name: 'ProcessName', index: 'ProcessName', width: 55 },
{ name: 'WorkingSet64', index: 'WorkingSet64', width: 90 }
],
rowNum: 10,
width: 700,
rowList: [10, 20, 30],
sortname: 'invdate',
viewrecords: true,
sortorder: "desc",
caption: "New API Example"
});
});
</script>
HTML is as follows
HTML如下
<table id="jqgajax">
</table>
<div id="jqgajax">
</div>
Web Service output when clicking on Invoke button
单击“调用”按钮时的 Web 服务输出
<string xmlns="http://tempuri.org/">
[{"ProcessName":"Dropbox","WorkingSet64":22736896},
{"ProcessName":"fdhost","WorkingSet64":1941504},
{"ProcessName":"IntelliTrace","WorkingSet64":39276544}
]
</string>
Please suggest what is there that I am missing.
<string xmlns="http://tempuri.org/">
tags are irritating me. I am assuming that these tags are not letting my grid able to bind.
请建议我缺少什么。
<string xmlns="http://tempuri.org/">
标签让我很恼火。我假设这些标签不会让我的网格能够绑定。
UPDATE:
更新:
ASMX service now looks like as below.
ASMX 服务现在如下所示。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class SampleService : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<demo> GetJsonServerProcess()
{
List<demo> test = new List<demo>();
for(int i=1;i<=10;i++)
test.Add(new demo { ProcessName = string.Format("Sample {0}",i), WorkingSet64 = i });
var re = test;
return re;
}
}
public class demo
{
public string ProcessName { get; set; }
public int WorkingSet64 { get; set; }
}
采纳答案by Oleg
Clicking on the Invoke button returns XML because the request don't specify the contentType: 'application/json; charset=utf-8'
. So the experiment with clicking on Invoke button help not really.
单击 Invoke 按钮会返回 XML,因为请求未指定contentType: 'application/json; charset=utf-8'
. 因此,单击“调用”按钮的实验实际上并没有帮助。
The main problem in your code is that you convert the data to string inside of web method. The line
您代码中的主要问题是您将数据转换为 Web 方法内的字符串。线
json = Lib.ToJSON(obj);
are not needed. What one typically do is returning the object. The GetJsonServerProcess
should be changed to something like
不需要。通常做的是返回对象。该GetJsonServerProcess
应改为类似
[ScriptService]
public class SampleService : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<Process> GetJsonServerProcess()
{
int memory = 1;
return System.Diagnostics.Process.GetProcesses()
.Where(r => r.WorkingSet64 > memory)
.Select(p => new { p.ProcessName, p.WorkingSet64 })
.ToList();
}
}
The next problem is that the default input format which wait jqGrid is another (see here). So you cave to specify jsonReader
which describe the data format. In your case it will be something like
下一个问题是等待 jqGrid 的默认输入格式是另一个(请参阅此处)。因此,您需要指定jsonReader
哪种描述数据格式。在您的情况下,它将类似于
jsonReader: {
repeatitems: false,
id: "ProcessName",
root: function (obj) { return obj; },
page: function () { return 1; },
total: function () { return 1; },
records: function (obj) { return obj.length; }
}
Additionally you should never use http://localhost:1092/
prefix in Ajax url
because you cal only get data from the same site because of security reasons. The data
parameter in jqGrid has another meaning as in jQuery so you should remove data: "{}"
and move type: "POST"
from ajaxGridOptions
to mtype: "POST"
. As the result you will have something like
此外,您永远不应该http://localhost:1092/
在 Ajax 中使用前缀,url
因为出于安全原因,您只能从同一站点获取数据。data
jqGrid 中的参数与 jQuery 中的参数具有另一种含义,因此您应该删除data: "{}"
并type: "POST"
从ajaxGridOptions
移至mtype: "POST"
。结果你会得到类似的东西
$(document).ready(function () {
$("#jqgajax").jqGrid({
mtype: "POST",
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
url: '/SampleService.asmx/GetJsonServerProcess',
postData: "{}", // remove all parameters which jqGrid send typically
datatype: "json",
colNames: ['ProcessName', 'WorkingSet64'],
colModel: [
{ name: 'ProcessName', index: 'ProcessName', width: 155 },
{ name: 'WorkingSet64', index: 'WorkingSet64', width: 190 }
],
jsonReader: {
repeatitems: false,
id: "ProcessName",
root: function (obj) { return obj; },
page: function () { return 1; },
total: function () { return 1; },
records: function (obj) { return obj.length; }
},
rowNum: 10,
loadonce: true,
gridview: true,
height: 'auto',
rowList: [10, 20, 30],
viewrecords: true,
sortorder: "desc",
caption: "New API Example"
});
});
I don't tested the code, but it should be more close to what you need.
我没有测试代码,但它应该更接近你的需要。
UPDATED: You should fix the code by changing jsonReader
. You can download the working demo here. It display the grid
更新:您应该通过更改来修复代码jsonReader
。您可以在此处下载工作演示。它显示网格
I used on the server side the code
我在服务器端使用了代码
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web.Services;
namespace jqGridWebASMX
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class SampleService : WebService
{
[WebMethod]
public List<Demo> GetJsonServerProcess()
{
const int memory = 1;
return Process.GetProcesses()
.Where (r => r.WorkingSet64 > memory)
.Select(p => new Demo {
Id = p.Id,
ProcessName = p.ProcessName,
WorkingSet64 = p.WorkingSet64
})
.ToList();
}
}
public class Demo
{
public int Id { get; set; }
public string ProcessName { get; set; }
public long WorkingSet64 { get; set; }
}
}
and on the client side
在客户端
$("#list").jqGrid({
mtype: "POST",
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
url: '/SampleService.asmx/GetJsonServerProcess',
postData: "{}", // remove all parameters which jqGrid send typically
datatype: "json",
colNames: ['ProcessName', 'WorkingSet64'],
colModel: [
{ name: 'ProcessName', index: 'ProcessName', width: 200 },
{ name: 'WorkingSet64', index: 'WorkingSet64', width: 120,
formatter: 'integer', sorttype: 'int', align: 'right' }
],
jsonReader: {
repeatitems: false,
id: "Id",
root: function (obj) { return obj.d; },
page: function () { return 1; },
total: function () { return 1; },
records: function (obj) { return obj.d.length; }
},
rowNum: 10,
loadonce: true,
gridview: true,
height: 'auto',
pager: '#pager',
rowList: [10, 20, 30],
rownumbers: true,
viewrecords: true,
sortorder: "desc",
caption: "New API Example"
});
$("#pager_left").hide(); // hide unused part of the pager to have more space
回答by pythonian29033
Okay, I got the same error and after a load of trial and error here's my "quick and dirty" solution;
好的,我遇到了同样的错误,经过反复试验,这是我的“快速而肮脏”的解决方案;
$.get(url, {var1: parameter1, var2: parameter2}, function(data){
data = JSON.parse($(data).find("string").text());
alert("data.source: " + data.source);
});
回答by PrashantVatsa
The following code should do the trick:
以下代码应该可以解决问题:
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
回答by Darshan
This code works perfectly
这段代码完美运行
SqlDataAdapter sda = new SqlDataAdapter(strsql, ConfigurationManager.ConnectionStrings["BTConString"].ToString());
DataSet das = new DataSet();
sda.Fill(das);
Context.Response.Output.Write(JsonConvert.SerializeObject(das, Newtonsoft.Json.Formatting.Indented));
Context.Response.End();
return string.Empty;
回答by Sivashankar
Before function starts put the below
在功能开始之前把下面的
[System.Web.Services.WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
make function as void
使函数为空
when the function ends put below line
当函数结束时放在线下
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
Example program
示例程序
[System.Web.Services.WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void testJson()
{
string json = "{}";
this.Context.Response.ContentType = "";
this.Context.Response.Write(json);
}
回答by Mohamed.Abdo
response = await client.GetAsync(RequestUrl, HttpCompletionOption.ResponseContentRead);
if (response.IsSuccessStatusCode)
{
_data = await response.Content.ReadAsStringAsync();
try
{
XmlDocument _doc = new XmlDocument();
_doc.LoadXml(_data);
return Request.CreateResponse(HttpStatusCode.OK, JObject.Parse(_doc.InnerText));
}
catch (Exception jex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, jex.Message);
}
}
else
return Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.NotFound)).Result;
回答by user1907606
For Valid JSON response use this code..
对于有效的 JSON 响应,请使用此代码..
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class SampleService : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void GetJsonServerProcess()
{
int memory = 1;
string json = string.Empty;
var obj = (System.Diagnostics.Process.GetProcesses().Where(r => r.WorkingSet64 > memory).Select(p => new { p.ProcessName, p.WorkingSet64 }).ToArray());
json = Lib.ToJSON(obj);
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
}
}