.Net Web服务内容类型

时间:2010-02-11 17:17:45

标签: .net xml web-services content-type

我需要创建一个应该接收xml并返回xml的.Net Web服务(WCF是不可能的)。我最初设置的功能如下:

[WebMethod]
public string myFunc(string xmlRequest)
{

如何将HTTP POST内容类型更改为text / xml?另外,我将xml响应作为字符串返回,但在Web服务帮助页面中,它表示响应将是:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.mysite.com/myFunc">string</string>

我需要以某种方式删除该根<string>元素。

此Web服务由另一家公司调用,该公司可能没有使用.Net将XML作为text / xml发布到我的端点。

5 个答案:

答案 0 :(得分:1)

我有一个开源Web服务框架(在.NET和Mono上运行),极大地简化了创建Web服务所需的工作量。它自动配置为为您的所有Web服务提供XML(+ REST),JSON(+ REST),SOAP 1.1 / 1.2端点:

可从以下网址获取:

http://www.servicestack.net/

还有一个实时的javascript和silverlight演示(在CentOS / Nginx上运行): http://www.servicestack.net/ServiceStack.Examples.Clients/Default.htm

此处提供了一个在线教程,介绍了创建和使用Web服务的过程(适用于MonoTouch但适用于所有地方):

http://www.servicestack.net/monotouch/remote-info/

答案 1 :(得分:1)

要删除String,您必须像这样制作返回参数xml:

public **System.Xml.XmlDocument** MyFunc(string xmlRequest)

这将使响应变为;

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length


<?xml version="1.0" encoding="utf-8"?>
xml

答案 2 :(得分:0)

有效的XML文档必须包含根元素。除非string元素存在,否则它不是XML。否则,它将是一个纯文本响应。

答案 3 :(得分:0)

坚持,您想要将数据发布为XML,但是将其作为XML字符串接收回来吗?如果我没有误解你在说什么,那肯定是你在做什么,而且说实话,这感觉很不对。

无法将字符串解析为Web服务中的XML文档,并且其他公司无法处理单个节点的XML文档的原因是什么?他们不能从该单个节点获取字符串值,然后自己解析字符串XML吗?

答案 4 :(得分:0)

<string>元素显示原样,因为您的方法被定义为返回一个字符串。在幕后,.NET实际上只接受您的方法返回的任何对象,并将其序列化。序列化字符串表示为<string>actual string contents</string>

您要做的是以某种方式返回一个序列化到您想要的消息的对象,或者假设您的字符串实际上包含XML,将其直接写入响应流。

我从未真正尝试过[WebMethod],但可能的工作方式如下:

[WebMethod]
public void myFunc(string xmlRequest)
{
    var myXml = @"<?xml version="1.0" encoding="utf-8"?><myRoot><myElement /></myRoot>";
    Response.ContentType = "text/xml";
    Response.Write(myXml);
    Response.Flush();
    Response.Close();
}

作为旁注,WCF实际上做了同样的事情。如果您定义WCF服务操作:

[OperationContract]
public string myFunc()
{
    return "hi";
}

返回的XML(实际上进一步包含在SOAP中)是<string>hi</string>就像您在这里使用经典Web服务一样。在WCF中“解包”XML有点痛苦。你必须做一个自定义的消息编写者,IIRC。