C# 使用RESTAPI返回XML文档
我想从rest api请求返回一个xml文档:C# 使用RESTAPI返回XML文档,c#,xml,rest,C#,Xml,Rest,我想从rest api请求返回一个xml文档: [HttpPost] public string getClassXml(HttpRequestMessage req) { var response = Request.CreateResponse(HttpStatusCode.OK); var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); ClassXML clas
[HttpPost]
public string getClassXml(HttpRequestMessage req)
{
var response = Request.CreateResponse(HttpStatusCode.OK);
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid = new ClassXML();
XmlDocument doc = new XmlDocument();
try
{
var data = req.Content.ReadAsStringAsync().Result;
classid = serializer.Deserialize<ClassXML>(data.ToString().Trim());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
reader.Read();
doc.Load(reader);
return doc.innerXml;
}
[HttpPost]
公共字符串getClassXml(HttpRequestMessage req)
{
var response=Request.CreateResponse(HttpStatusCode.OK);
var serializer=new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid=新的ClassXML();
XmlDocument doc=新的XmlDocument();
尝试
{
var data=req.Content.ReadAsStringAsync().Result;
classid=serializer.Deserialize(data.ToString().Trim());
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
字符串路径=ASDb.ReadValue(“从alclass中选择定义XML,其中classid='”+classid.classid+'”)).ToString();
XmlTextReader=新的XmlTextReader(AppDomain.CurrentDomain.BaseDirectory+“Resource\\”+percorso);
reader.Read();
文件加载(读卡器);
返回doc.innerXml;
}
但通过这种方式,我得到一个字符串,我希望得到一个XmlDocument而不是字符串。我还试图返回XmlDocument文档,但它给了我一个错误:他'ObjectContent'1'类型未能序列化内容类型'application/xml'的响应体;字符集=utf-8'。
您有什么想法吗?也许问题不在于API层,但当您尝试使用XmlTextReader时
XmlTextReader=newxmltextreader(AppDomain.CurrentDomain.BaseDirectory+“Resource\\”+percorso)代码>
您试图读入的XML是什么样子的?你检查过它的形状了吗
关于“使用REST API返回XML文档”,我建议您只需将XML文档输出为具有适当MIME类型的字符串,执行如下操作:
[HttpPost]
public HttpResponseMessage getClassXml(HttpRequestMessage req)
{
...
XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
reader.Read();
doc.Load(reader);
HttpResponseMessage response = new HttpResponseMessage { Content = new StringContent(doc.innerXml, Encoding.UTF8,"application/xml") };
return response;
}
RESTAPI输出应该映射到标准的internet mime类型(例如JSON数据、图像、文本等,而不是XmlDocument)。无论使用RESTAPI的是什么,只要获取文本并在必要时将其转换为XmlDocument即可
顺便说一句,在您提供的示例中,您似乎没有使用一半的代码,您可能可以将其清理干净:
string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
也许问题不在于API层,但当您尝试使用XmlTextReader时
XmlTextReader=newxmltextreader(AppDomain.CurrentDomain.BaseDirectory+“Resource\\”+percorso)代码>
您试图读入的XML是什么样子的?你检查过它的形状了吗
关于“使用REST API返回XML文档”,我建议您只需将XML文档输出为具有适当MIME类型的字符串,执行如下操作:
[HttpPost]
public HttpResponseMessage getClassXml(HttpRequestMessage req)
{
...
XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
reader.Read();
doc.Load(reader);
HttpResponseMessage response = new HttpResponseMessage { Content = new StringContent(doc.innerXml, Encoding.UTF8,"application/xml") };
return response;
}
RESTAPI输出应该映射到标准的internet mime类型(例如JSON数据、图像、文本等,而不是XmlDocument)。无论使用RESTAPI的是什么,只要获取文本并在必要时将其转换为XmlDocument即可
顺便说一句,在您提供的示例中,您似乎没有使用一半的代码,您可能可以将其清理干净:
string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
正如几秒钟前有人在这里写的(但随后删除了他的答案),问题是XmlDocument不可序列化,如果改用XmlElement就可以了。以下是我所做的:
[HttpPost]
public XmlElement getClassXml(HttpRequestMessage req)
{
var response = Request.CreateResponse(HttpStatusCode.OK);
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid = new ClassXML();
XmlDocument doc = new XmlDocument();
try
{
var data = req.Content.ReadAsStringAsync().Result;
classid = serializer.Deserialize<ClassXML>(data.ToString().Trim());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
reader.Read();
doc.Load(reader);
XmlElement element = doc.DocumentElement;
return element;
}
[HttpPost]
公共XmlElement getClassXml(HttpRequestMessage请求)
{
var response=Request.CreateResponse(HttpStatusCode.OK);
var serializer=new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid=新的ClassXML();
XmlDocument doc=新的XmlDocument();
尝试
{
var data=req.Content.ReadAsStringAsync().Result;
classid=serializer.Deserialize(data.ToString().Trim());
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
字符串路径=ASDb.ReadValue(“从alclass中选择定义XML,其中classid='”+classid.classid+'”)).ToString();
XmlTextReader=新的XmlTextReader(AppDomain.CurrentDomain.BaseDirectory+“Resource\\”+percorso);
reader.Read();
文件加载(读卡器);
XmlElement=doc.DocumentElement;
返回元素;
}
正如几秒钟前有人在这里写的那样(但随后删除了他的答案),问题是XmlDocument不可序列化,如果改用XmlElement就可以了。以下是我所做的:
[HttpPost]
public XmlElement getClassXml(HttpRequestMessage req)
{
var response = Request.CreateResponse(HttpStatusCode.OK);
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid = new ClassXML();
XmlDocument doc = new XmlDocument();
try
{
var data = req.Content.ReadAsStringAsync().Result;
classid = serializer.Deserialize<ClassXML>(data.ToString().Trim());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
reader.Read();
doc.Load(reader);
XmlElement element = doc.DocumentElement;
return element;
}
[HttpPost]
公共XmlElement getClassXml(HttpRequestMessage请求)
{
var response=Request.CreateResponse(HttpStatusCode.OK);
var serializer=new System.Web.Script.Serialization.JavaScriptSerializer();
ClassXML classid=新的ClassXML();
XmlDocument doc=新的XmlDocument();
尝试
{
var data=req.Content.ReadAsStringAsync().Result;
classid=serializer.Deserialize(data.ToString().Trim());
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
字符串路径=ASDb.ReadValue(“从alclass中选择定义XML,其中classid='”+classid.classid+'”)).ToString();
XmlTextReader=新的XmlTextReader(AppDomain.CurrentDomain.BaseDirectory+“Resource\\”+percorso);
reader.Read();
文件加载(读卡器);
XmlElement=doc.DocumentElement;
返回元素;
}
很抱歉,如果我现在想从HttpPost更改为HttpGet,我将如何获取以下url中的参数:http://localhost/arcosat/api/ws/GetClassXml?classid=myclass
我想获取“myclass”字符串,但是带有req.Content.ReadAsStringAsync().Result
它不再工作了很抱歉,但是如果我现在想从HttpPost更改为HttpGet,我将如何获取以下url中的参数:http://localhost/arcosat/api/ws/GetClassXml?classid=myclass
我想获得“myclass”字符串,但带有req.Content.ReadAsStringAsync().Result
它不再工作了为什么不从消费端的方法获得的xml生成XmlDocument。创建web服务时,不建议返回类似XmlDocument的复杂类;如果有人从另一种语言(如PHP)访问您的服务,那么他们将无法使用compl