Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WCF响应在ASP.NET WebForms中作为Json,使用Json.NET_Javascript_Wcf_Json.net_Webforms - Fatal编程技术网

Javascript WCF响应在ASP.NET WebForms中作为Json,使用Json.NET

Javascript WCF响应在ASP.NET WebForms中作为Json,使用Json.NET,javascript,wcf,json.net,webforms,Javascript,Wcf,Json.net,Webforms,我使用的是一个WCF服务,我想用一个对象列表来响应它。由于我的对象是由entity framework生成的,所以我无法真正返回列表,因为它有一些循环引用,并且默认序列化失败。因此,我使用匿名类型创建一个只包含我需要的属性的对象列表。 这就是我使用Json.NET所做的: [OperationContract] public string DoWork() { using (X ent = new X()) {

我使用的是一个WCF服务,我想用一个对象列表来响应它。由于我的对象是由entity framework生成的,所以我无法真正返回列表,因为它有一些循环引用,并且默认序列化失败。因此,我使用匿名类型创建一个只包含我需要的属性的对象列表。 这就是我使用Json.NET所做的:

[OperationContract]
        public string DoWork()
        {
            using (X ent = new X())
            {
                var modules = from p in ent.Modules select new { Name = p.Name, Value = p.ID };
                return JsonConvert.SerializeObject(modules);
            } 
        }
现在,这是我的javascript,它在表中呈现结果:

function btn_onclick() {
            var srv = new DDSProjectManagement.ProjectsService();
            srv.DoWork(Res, null, null);
        }
        function Res(dataList) {
            var divObj = document.getElementById('tablePos');

            var name = 'Name';
            var desc = 'Description';

            var tableStart = '<table><tbody><tr><th>Name</th><th>Description</th></tr>';
            var tableContent = '';
            var tableEnd = '</tbody></table>';

            for (var i = 0; i < dataList.length; i++) {
                tableContent += '<tr><td>' + dataList[i].Name + '</td><td>' + dataList[i].Value + '</td></tr>';
            }
            divObj.innerHTML = tableStart + tableContent + tableEnd;
        }
函数btn\u onclick(){
var srv=新的DDSProjectManagement.ProjectsService();
srv.DoWork(Res,null,null);
}
函数Res(数据列表){
var divObj=document.getElementById('tablePos');
变量名称='name';
var desc=‘说明’;
var tableStart='namescription';
var tableContent='';
var tableEnd='';
对于(var i=0;i
如果我这样做,javascript获取的参数只是一个字符串,它无法将其视为对象列表。当然,它应该是一个Json字符串,我可以尝试解析它,以便它从中提取对象。但是我真的想使用javascript,就像现在一样,修改服务。例如,在以下情况下更改我的服务就可以了:

public List<SimpleObject> DoWork()
        {                
            return new List<SimpleObject>() { new SimpleObject("Florin", 1), new SimpleObject("Andrei", 2) };
        }
public List DoWork()
{                
return new List(){new SimpleObject(“Florin”,1),new SimpleObject(“Andrei”,2)};
}
SimpleObject不是EntityFramework对象,因此这没有问题。我假设默认序列化程序是Json序列化程序,javascript应该获得基本相同的参数:Json字符串

所以我的问题是,如何让我的方法向我的JS发送匿名类型对象列表,因为通过Json.NET构建字符串不起作用? 提前谢谢。

调查。。。它将允许您从服务器端将信息推送到JavaScript。我做了一些类似的事情,在我的ASP.NETMVC3页面上有一个WCF服务,然后每当我的服务收到数据时,我就把它推到我的JavaScript上

我的服务将信息发送给我的信号员“调解人”:

public void Message(string messagePacket)
    {
        new NotificationMediator().NotifyClients(messagePacket);
    }
在我的例子中,我只是新建了一个新的中介(signarhub),然后对其调用一个方法。这是我的信号处理程序(NotifyClient):

public void NotifyClients(字符串消息)
{
Hub.GetClients().Log(消息);
}
现在,日志是我UI上的JavaScript方法。下面是我的JavaScript代码来处理这个问题:

mediator.Log = function (message) {
        var msg = $.parseJSON(message);
        $("#logContainer").append(msg.Data + "<br />");
mediator.Log=函数(消息){
var msg=$.parseJSON(消息);
$(“#logContainer”).append(msg.Data+”
);
这终于对我起作用了。方法的返回类型是Stream,下面是它的工作方式:

    public Stream GetModules()
            {
                using (PMEntity ent = new PMEntity())
                {                
                    List<Module> ret = new List<Module>();
                    ret = ent.Modules.Include("Project").ToList();

                    return new MemoryStream(
                            Encoding.UTF8.GetBytes(
                            JsonConvert.SerializeObject(
                            ret.Select(e => new { Name = e.Name, Value = e.ID }))));
                }
            }
公共流GetModules()
{
使用(PMEntity ent=new PMEntity())
{                
List ret=新列表();
ret=ent.Modules.Include(“项目”).ToList();
返回新内存流(
Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(
ret.Select(e=>new{Name=e.Name,Value=e.ID}));
}
}

您必须发送一个字符串,然后从JavaScript解析JSON。没有其他方法可以做到这一点。(我想您可以用不同的格式进行序列化,比如XML,但这基本上是相同的问题。)
    public Stream GetModules()
            {
                using (PMEntity ent = new PMEntity())
                {                
                    List<Module> ret = new List<Module>();
                    ret = ent.Modules.Include("Project").ToList();

                    return new MemoryStream(
                            Encoding.UTF8.GetBytes(
                            JsonConvert.SerializeObject(
                            ret.Select(e => new { Name = e.Name, Value = e.ID }))));
                }
            }