Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
C# 使用RESTAPI返回XML文档_C#_Xml_Rest - Fatal编程技术网

C# 使用RESTAPI返回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

我想从rest api请求返回一个xml文档:

[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