我一直在寻找最近3个小时的100个链接,例如将scriptfactory添加到webconfig,3个错误,设置内容类型等。
我无法弄清楚究竟是什么错误。
环境: 服务在.net 4.0上运行 在.net 4.0上运行的Web应用程序
要求: 我需要将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如下
<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如下
<table id="jqgajax">
</table>
<div id="jqgajax">
</div>
单击“调用”按钮时的Web服务输出
<string xmlns="http://tempuri.org/">
[{"ProcessName":"Dropbox","WorkingSet64":22736896},
{"ProcessName":"fdhost","WorkingSet64":1941504},
{"ProcessName":"IntelliTrace","WorkingSet64":39276544}
]
</string>
请建议我缺少什么。
<string xmlns="http://tempuri.org/">
标签让我感到恼火。我假设这些标签不让我的网格能够绑定。
更新
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; }
}
答案 0 :(得分:6)
单击Invoke按钮返回XML,因为请求未指定contentType: 'application/json; charset=utf-8'
。因此,单击“调用”按钮的实验并不能帮助实现。
代码中的主要问题是您将数据转换为Web方法内的字符串。这条线
json = Lib.ToJSON(obj);
不需要。通常做的是返回对象。 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();
}
}
下一个问题是等待jqGrid的默认输入格式是另一个(参见here)。因此,您需要指定描述数据格式的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; }
}
此外,您不应在Ajax http://localhost:1092/
中使用url
前缀,因为出于安全原因,您只能从同一站点获取数据。 jqGrid中的data
参数与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"
});
});
我没有测试代码,但它应该更接近你需要的东西。
更新:您应该通过更改jsonReader
来修复代码。您可以下载工作演示here。它显示网格
我在服务器端使用了代码
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; }
}
}
并在客户端
$("#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
答案 1 :(得分:1)
好的,我得到了同样的错误,经过大量的试验和错误后,这是我的“快速而肮脏”的解决方案;
$.get(url, {var1: parameter1, var2: parameter2}, function(data){
data = JSON.parse($(data).find("string").text());
alert("data.source: " + data.source);
});
答案 2 :(得分:1)
以下代码可以解决这个问题:
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
答案 3 :(得分:1)
此代码完美无缺
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;
答案 4 :(得分:0)
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;
答案 5 :(得分:0)
函数启动前,请在下面放置
[System.Web.Services.WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
使函数为空
函数结束时,将其放在行下方
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
示例程序
[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);
}
答案 6 :(得分:0)
您可以将网址放在邮递员中并使用回复
就像我正在使用php
<h3>What is Lorem Ipsum?</h3>
<p>First</p>
<h3>Where does it come from?</h3>
<p>Second</p>
<h3>Why do we use it?</h3>
<p>Third</p>
答案 7 :(得分:-1)
对于有效的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);
}
}