网上很多用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>";
类似这样的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>";
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里的节点与后端的方法签名对应上
楼上各位讲的 太“微言大义”了 我有点不明白
//创建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期待什么样的数据
复制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);
}
}
}
{
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();
}
}
我后端的程序是WCF
我想应该用到 DataContract 或者 MessageContract或者接收函数的参数直接写Message
关键是WCF里的逻辑
不是怎么匹配参数的问题
还是没搞WCF的牛人?
[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;
}
我更希望听你谈谈WCF的messagecontract
或者直接从message类跟我谈谈WCF的消息传递机制(户端与服务之间的所有通信最终都会产生要进行发送和接收的 Message 实例)
我在XML上遇到了问题
TRY: [OperationContract,XmlSerializerFormat]
[WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,RequestFormat=WebMessageFormat.Xml)]
MyDataType XmlService(int id, string mytitle, string mycontent);
处理请求时服务器遇到错误。有关详细信息,请参阅服务器日志。
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);
到现在为止的所有示例均依靠 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 合同进行直接控制时才有必要使用该技术。