网上很多用ajax给WCF服务提交JSON数据
类似这样的JSON数据可以和WCF中的方法签名完好的对应
var json = '{"id":'+id+',"mytitle":"'+title+'","mycontent":"'+content+'"}';
假设我想提交XML数据,怎么让XML的节点和WCF中的方法签名对应呢

xml+="<id>"+id+"</id>";
xml+="<mytitle>"+title+"</mytitle>";
xml+="<mycontent>"+content+"</mycontent>";

解决方案 »

  1.   

    获取XML,赋值给dataset或取节点数据
      

  2.   

    楼上各位我是通过AJAX    POST一个XML数据到
    WCF后端
    POST的数据是这样
    xml+=" <id>"+id+" </id>"; 
    xml+=" <mytitle>"+title+" </mytitle>"; 
    xml+=" <mycontent>"+content+" </mycontent>";后端的方法是这样
            public MyDataType XmlService(int id, string mytitle, string mycontent)
            {
                return MyService(id, mytitle, mycontent, "以XML形式传递");
            }我怎么让XML里的节点与后端的方法签名对应上
    楼上各位讲的 太“微言大义”了     我有点不明白
      

  3.   

    麽意思啊 不明白前面送XML, 后面收XML,然后对XML进行解析分装到相应位置,再调用后面环节对应处理?
      

  4.   

    前端AJAX代码<script language="javascript" type="text/javascript">
    //创建XMLHTTP
    function createXMLHTTP(){
    var httpRequest;
         try {
            httpRequest = new XMLHttpRequest();
         }
         catch (e) {
             try {
                 httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
             }
             catch (e) {
                try {
                    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                 }
                catch (e) {
                    return null;
                }
            }
        }
        return httpRequest;
    }
    //构造XML格式的文本
    function createXML(){
      var id = document.getElementById("id").value;  
      var title = document.getElementById("title").value;
      var content = document.getElementById("content").value;
      //var xml = '<root type="object">';
      var xml = '';
      xml+='<id type="number">'+id+'</id>';
      xml+='<mytitle type="string">'+title+'</mytitle>';
      xml+='<mycontent type="string">'+content+'</mycontent>';
      //xml+='</root>';
      return xml;
    }
    //构造JSON字符串
    function createJSON(){
      var id = document.getElementById("id").value;  
      var title = document.getElementById("title").value;
      var content = document.getElementById("content").value;
      var json = '{"id":'+id+',"mytitle":"'+title+'","mycontent":"'+content+'"}';
      return json;
    }
    //异步调用服务器
    function callServer(postType) { 
    var xmlHttp =createXMLHTTP();
    if (xmlHttp == null) {alert('浏览器不支持ajax');return;}
    xmlHttp.onreadystatechange = function(){
     if (xmlHttp.readyState == 4) {callBack(xmlHttp.responseText)}
    }
    var body;
    var contentType;
    var url;
    if(postType == 'json'){
        body = createJSON();
        contentType = "application/json";
        url = "/JsonXmlService.svc/JsonService";
    }
    if(postType == 'xml'){
        body = createXML();
        contentType = "text/xml";
        url = "/JsonXmlService.svc/XmlService";
    }
    xmlHttp.open("POST", url, true);
    xmlHttp.setRequestHeader("Content-type", contentType);
    xmlHttp.send(body);
    }
    //回调事件
    function callBack(responseText){
    alert(responseText);
    //var result = eval("(" + responseText + " )").d;
    //alert(result.Id+'\n\n'+result.MyTitle+'\n\n'+result.Content);
    }
    </script>
    后端WCF代码namespace JsonXmlWcf
    {
        [ServiceContract(Namespace = "")]
        public interface IJsonXmlService
        {
            [OperationContract]
            [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
            MyDataType JsonService(int id, string mytitle, string mycontent);
            [OperationContract]
            [WebInvoke(ResponseFormat = WebMessageFormat.Xml, RequestFormat=WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
            MyDataType XmlService(int id, string mytitle, string mycontent);
        }
        public class JsonXmlService:IJsonXmlService
        {
            public MyDataType JsonService(int id,string mytitle,string mycontent)
            {
                return MyService(id, mytitle, mycontent, "以JSON形式传递");
            }
            public MyDataType XmlService(int id, string mytitle, string mycontent)
            {
                return MyService(id,mytitle,mycontent,"以XML形式传递");
            }
            private MyDataType MyService(int id,string mytitle,string mycontent,string info)
            {
                MyDataType MyData = new MyDataType();
                MyData.Id = id;
                MyData.MyTitle = string.Format("{0}({1})", mytitle,info);
                MyData.MyContent = mycontent;
                return MyData;
            }
        }
        [DataContract]
        public class MyDataType
        {
            private int _id;
            private string _mytitle;
            private string _content;
            [DataMember]
            public int Id
            {
                get { return _id; }
                set { _id = value; }
            }
            [DataMember]
            public string MyTitle
            {
                get { return _mytitle; }
                set { _mytitle = value; }
            }
            [DataMember]
            public string MyContent
            {
                get { return _content; }
                set { _content = value; }
            }
        }
    }
    前端postType == 'json'的时候,完全正确
    postType == 'xml'的时候
    反馈的错误是:
    处理请求时服务器遇到错误。有关详细信息,请参阅服务器日志。另外我想知道遇到这样的情况怎么调试    
    我怎么知道WCF期待什么样的数据
      

  5.   

    把xml数据读取到dataset ,然后取其中的数与WCF中的方法签名对比
      

  6.   


    复制C#源代码using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml;
    using System.Data;namespace XmlDesign
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet ds = new DataSet();
                #region 转换一个XML文件(本地\网络均可)为一个DataSet
                //http://news.baidu.com/n?cmd=1&class=sportnews&tn=rss            //F:\study\001CSharp_Study\002Source\XmlDesign\XmlDesign\Save_Plan.xml            ds = XmlDatasetConvert.ConvertXMLFileToDataSet(@"http://news.baidu.com/n?cmd=1&class=sportnews&tn=rss");
                Console.WriteLine("数据集名为\"{0}\",包含{1}个表", ds.DataSetName, ds.Tables.Count);
                foreach (DataTable dt in ds.Tables)
                {
                    PrintTableName(dt.TableName);
                }
                #endregion            #region 构造一个DataSet,并转换为XML字符串
                DataSet ds1 = new DataSet();
                DataTable dt1 = new DataTable();
                dt1.TableName = "test";
                dt1.Columns.Add("id");
                dt1.Columns.Add("name");
                dt1.Rows.Add("i001", "hekui");
                dt1.Rows.Add("i002", "liyang");            DataTable dt2 = new DataTable();
                dt2.TableName = "test1";
                dt2.Columns.Add("bookid");
                dt2.Columns.Add("bookname");
                dt2.Rows.Add("b001", "书本1");
                dt2.Rows.Add("b002", "书本2");            ds1.Tables.Add(dt1);
                ds1.Tables.Add(dt2);
                ds1.DataSetName = "方案";
                string xmlOut = XmlDatasetConvert.ConvertDataSetToXML(ds1);
                #endregion            #region 转换一个XML字符串为一个DataSet
                DataSet ds2 = new DataSet();
                ds2 = XmlDatasetConvert.ConvertXMLToDataSet(xmlOut);
                Console.WriteLine("数据集名为\"{0}\",包含{1}个表", ds2.DataSetName, ds2.Tables.Count);
                foreach (DataTable dt in ds2.Tables)
                {
                    PrintTableName(dt.TableName);
                }
                #endregion            #region 转换一个Dataset为一个XML文件
                XmlDatasetConvert.ConvertDataSetToXMLFile(ds2, "c:\\adadsda1.xml");
                #endregion            Console.ReadLine();
            }        private static void PrintTableName(string tableName)
            {
                Console.WriteLine(tableName);
            }
        }
    }
      

  7.   

    //将xml对象内容字符串转换为DataSet        public static DataSet ConvertXMLToDataSet(string xmlData)
            {
                StringReader stream = null;
                XmlTextReader reader = null;
                try
                {
                    DataSet xmlDS = new DataSet();
                    stream = new StringReader(xmlData);
                    //从stream装载到XmlTextReader                reader = new XmlTextReader(stream);
                    xmlDS.ReadXml(reader);
                    return xmlDS;
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (reader != null)
                        reader.Close();
                }
            }
      

  8.   

    楼上的大哥   你注意一下
    我后端的程序是WCF
    我想应该用到   DataContract    或者    MessageContract或者接收函数的参数直接写Message
    关键是WCF里的逻辑
    不是怎么匹配参数的问题
      

  9.   

    CSDN里没牛人了吗
    还是没搞WCF的牛人?
      

  10.   

    1.在有JSON的情况下,为什么需要XML呢?对于JavaScript来说,操作XML的成本比操作JSON要高得多。2.你可以开一个新的项目,添加引用,然后把你的WCF服务加进去,Visual Studio会帮你生成好代理类。接着调用一下那个WCF服务,用Fiddler之类的监听一下HTTP通信,你就能看到具体的XML格式了。这比你去看WCF特定Web Service接口的XML规范要容易一些。
      

  11.   

    [OperationContract]
            [WebInvoke(RequestFormat = WebMessageFormat.Json)]
            public bool CreatePerson(Person p)
            {
                // 在此处添加操作实现   
                foreach (Person person in list)
                {
                    if (p.Name ==person.Name)
                    {
                        return false;
                    }
                }
                list.Add(p);
                Trace.WriteLine("-----------------------------------------");
                foreach (Person person in list)
                {
                    Trace.WriteLine("Name:" + person.Name + ",Address:" + person.Address);
                }
                Trace.WriteLine("-----------------------------------------");
                return true;
            }
      

  12.   

    23楼,你说了一堆没用的
    我更希望听你谈谈WCF的messagecontract
    或者直接从message类跟我谈谈WCF的消息传递机制(户端与服务之间的所有通信最终都会产生要进行发送和接收的 Message 实例)
      

  13.   

    25楼    还在说json    
    我在XML上遇到了问题
      

  14.   


    TRY:    [OperationContract,XmlSerializerFormat]
        [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,RequestFormat=WebMessageFormat.Xml)]
            MyDataType XmlService(int id, string mytitle, string mycontent);
      

  15.   

    提示错误
    处理请求时服务器遇到错误。有关详细信息,请参阅服务器日志。
    post过去的数据
      var xml = '';
      xml+='<id type="number">'+id+'</id>';
      xml+='<mytitle type="string">'+title+'</mytitle>';
      xml+='<mycontent type="string">'+content+'</mycontent>';
      return xml;
    后端的方法
            [OperationContract,XmlSerializerFormat]
            [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Xml)]
            MyDataType XmlService(int id, string mytitle, string mycontent);
      

  16.   

    消息和服务合同
    到现在为止的所有示例均依靠 WCF 将方法签名自动映射到 SOAP 消息。参数列表和返回类型将始终分别映射到请求和响应的 SOAP 主体。如果需要支持标题,可以编写另一个类来为个别操作建立整个 SOAP 封装的结构,同时指定哪些字段映射到标题和主体。使用 [MessageContract] 属性定义该映射:[MessageContract]
    public class EchoPersonMessage
    {
    [MessageBody]
    public Person Person;
    [MessageHeader]
    public Authorization Authorization;
    }在本例中,Person 字段被映射到 SOAP 主体,而 Authorization 字段被映射到 SOAP 标题。现在,可以在操作合同中使用 EchoPersonMessage:[ServiceContract]
    public interface IEchoService
    {
    ... //先前的方法已省略
    [OperationContract]
    void EchoPerson(EchoPersonMessage msg);
    }Using MessageContract 是一项更先进的技术,仅在需要对 SOAP 合同进行直接控制时才有必要使用该技术。