【问题标题】:How to send XML in a URI for posting to a Web API app?如何在 URI 中发送 XML 以发布到 Web API 应用程序?
【发布时间】:2014-02-24 18:21:24
【问题描述】:

我需要向我的 Web API 应用程序中的控制器方法发送一个 uri,该方法具有以下签名:

public HttpResponseMessage PostXMLFile(string serialNum, string siteNum, XElement xElement)

或者应该是这样的:

public HttpResponseMessage PostXMLFile(string serialNum, string siteNum, List<XElement> xElements)

?

无论如何,如您所见,它不能只是 XML,还必须有 serialNum 和 siteNum 参数。

我假设 uri 看起来像这样:

http://<machineName>:<port>/api/<ControllerName>?serialNum=N&siteNum=N&xElement=<some flattened XML>

IOW,类似于:

http://Platypus:4242/api/Platypi?serialNum=2&siteNum=7&xElement=<xml bla bla </xml>

我说得对吗(关于需要在 URI 中放置什么)?

如果是这样,我如何在那里获得“一些扁平化的 XML”。是不是这样的:

string xml = Bla; //some XML as string
XMLSerializer xmlSerial = new XMLSerializer();
string serialized = xmlSerial.Serialize(xml);

...然后将序列化的内容附加到 URI 的末尾?或者我怎样才能做到这一点?

注意:作为 arg 传递的 XML 通常包含数百个 XML“记录”(元素数组?)

更新

这就是我想做的事情(幻想伪代码):

UriBuilder uriBuilder = new UriBuilder();
XMLSerializer xmlCereal = new XMLSerializer();
File xmlToSerialize = // Load XML from file
string xmlAsStr = xmlCereal.Serialize(xmlToSerialize);
uriBuilder.Query.Add(xmlAsStr);
// pass uri to the Web API Post method

...但不知道如何在现实中实现它。

更新 2

另外,我是否必须通过向 WebApiConfig 的 Register 方法添加一些内容来明确指定 XML 作为要在我的 Web API 中序列化的类型?我目前有这个,明确添加了 Json:

public static void Register(HttpConfiguration config, IWindsorContainer container)
{
    MapRoutes(config);
    RegisterControllerActivator(container);
    config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
    config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
        new CamelCasePropertyNamesContractResolver();
}

我需要添加一个:

config.Formatters.XmlFormatter.UseXmlSerializer = true;

一行或几行也是?

【问题讨论】:

  • 我认为这些格式化程序只是用于响应,例如从控制器方法发送回 XML 或 JSON
  • 你能不能把XElement的参数改成字符串,然后做XElement.Parse()?
  • 我真的需要发送一个完整的 XML 文件,所以我可能需要一个通用的 XElement 列表或其他东西。
  • 如果你真的希望你的控制器方法接受 XElement 或 List 而不是 string 或 string[] 我不知道是否有任何开箱即用的东西可以做到这一点,但你可能能够创建一个自定义模型绑定器,然后将 ModelBinderAttribute 和您的自定义类型添加到您的方法中。
  • 我真的不在乎它发送什么/数据类型;我只需要能够发送两个字符串参数和一个“一堆”XML。 IOW,如果有一种方法可以将 XML 文件序列化为字符串,并且可以在另一端对其进行解析,而无需跳过太多微小和锋利的箍,那就没问题了。

标签: c# xml-parsing asp.net-web-api xml-serialization uri


【解决方案1】:

我会将此作为答案发布,因为它在 cmets 中有点难以描述

public HttpResponseMessage PostXMLFile(string serialNum, string siteNum, string xmlString)
{
    var xElement = XElement.Parse(xmlString);
    // do whatever now with your xElement;
}

然后你就可以像这样调用你的方法:

http://<machineName>:<port>/api/<ControllerName>?serialNum=2&siteNum=7&xmlString=<xml bla bla </xml>

(虽然要注意编码)

至于将 XML 添加到您的 url,因为它只是一个字符串,您可以将其作为普通文本读取并将其附加到您的 url。

如果您想接受元素列表,我相信您可以将控制器方法更改为

public HttpResponseMessage PostXMLFile(string serialNum, string siteNum, [ModelBinder]List<string> xmlStrings)
{
    foreach(var xmlString in xmlStrings)
    {
       var xElement = XElement.Parse(xmlString);
       // do whatever now with your xElement;
    }
}

你的网址看起来像

http://<machineName>:<port>/api/<ControllerName>?serialNum=2&siteNum=7&xmlStrings=<xml bla bla </xml>&xmlStrings=<xml more bla bla </xml>&xmlStrings=<xml even more bla bla </xml>

当文件内容和 xml 都已序列化时,您希望从文件加载文本然后将其“序列化”为 XML 以进行有线传输,这对我来说不太有意义。在您的控制器方法收到 xml 字符串之前,您不需要创建任何 XDocument 或 XElement。

【讨论】:

  • 我真正想做的是在传递另外两个参数(serialNum 和 siteNum)的同时发送一个 xml 文件; xml 文件可能太长而无法传递 URI。在接收端,我将解析 XML 文件。它需要从客户端作为 XML 发送,然后在 Web API 应用程序中进行解析。
  • “对我来说,您想从文件中加载文本然后将其“序列化”为 XML 对我来说不太有意义” 该文件以 XML 开头。他们为什么要这样发送,我不确定,但就是这样。在另一端/服务器端,它被解析,并且 XML 中的某些元素被发布到“数据库”(MS Access)。
  • 在这里查看我的新问题:stackoverflow.com/questions/22002407/…
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2010-11-18
  • 2012-03-19
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多