首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML :从内容中获取ASP.NET

XML :从内容中获取ASP.NET
EN

Stack Overflow用户
提问于 2018-08-07 05:15:22
回答 2查看 301关注 0票数 1

我的ASP.NET (.NET框架4.5.1)应用程序中有以下ApiController方法:

代码语言:javascript
复制
    [HttpPost]
    public void Post([FromBody]XElement value)
    {   
        ...
    }

但是,当我尝试通过Postman在内容中发布原始xml时,value总是空的。

以下是来自Fiddler的更多信息:

代码语言:javascript
复制
POST http://localhost:54193/api/punchoutsetup/post HTTP/1.1
Content-Type: text/xml
cache-control: no-cache
Postman-Token: e2d5563a-061b-4ddc-b03b-6f9d4835c535
User-Agent: PostmanRuntime/7.2.0
Accept: */*
Host: localhost:54193
accept-encoding: gzip, deflate
content-length: 1441
Connection: keep-alive

<?xml version="1.0"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML payloadID="1211221788.71299@ip-10-251-122-83" timestamp="Mon May 19 18:29:48 +0000 2008" xml:lang="en-US">
  <Header>
    <From>
      <Credential domain="DUNS">
        <Identity>test</Identity>
      </Credential>
    </From>
    <To>
      <Credential domain="DUNS">
        <Identity>test</Identity>
      </Credential>
    </To>
    <Sender>
      <Credential domain="DUNS">
        <Identity>test</Identity>
        <SharedSecret>test</SharedSecret>
      </Credential>
      <UserAgent>Coupa Procurement 1.0</UserAgent>
    </Sender>
  </Header>
  <Request>
    <PunchOutSetupRequest operation="create">
      <BuyerCookie>c64af92dc27e68172e030d3dfd1bc944</BuyerCookie>
      <Extrinsic name="FirstName">Jim</Extrinsic>
      <Extrinsic name="LastName"></Extrinsic>
      <Extrinsic name="UniqueName">jim</Extrinsic>
      <Extrinsic name="UserEmail"></Extrinsic>
      <Extrinsic name="User">jim</Extrinsic>
      <Extrinsic name="BusinessUnit"></Extrinsic>
      <Contact role="endUser">
        <Name xml:lang="en-US">jim</Name>
        <Email></Email>
      </Contact>
      <BrowserFormPost>
        <URL></URL>
      </BrowserFormPost>
    </PunchOutSetupRequest>
  </Request>
</cXML>

为什么它不能识别xml信息?

我看到Debug输出中抛出了以下异常:

代码语言:javascript
复制
Exception thrown: 'System.Web.HttpException' in System.Web.dll
Exception thrown: 'System.Xml.XmlException' in System.Runtime.Serialization.dll
Exception thrown: 'System.Runtime.Serialization.SerializationException' in System.Runtime.Serialization.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll

Visual Studio中有没有更详细的日志来检查出了什么问题?

EN

回答 2

Stack Overflow用户

发布于 2018-08-07 09:46:38

另一种方法是将XML作为原始字符串加载,然后将其解析为XElement

代码语言:javascript
复制
[HttpPost]
public IHtpActionResult Post([FromBody]string value) {
    if(string.IsNullOrWhiteSpace(value))
        return BadRequest();

    Xelement element = XElement.Parse(value);

    //...
}

主要问题是,模型绑定器无法将提供的原始数据绑定到所需的模型(在本例中为XElement),因此无法将其设置为默认值null。

要在默认情况下绑定,模型必须具有默认的无参数构造函数,以便模型绑定器初始化模型。XElement不需要。否则,您可能需要创建知道如何处理XElement的自定义参数绑定器

票数 0
EN

Stack Overflow用户

发布于 2021-07-03 02:10:20

我可以通过使用XMLDocument类(System.XML)做一些与@Nkosi类似的事情来实现这一点。

对我起作用的是:

代码语言:javascript
复制
[HttpPost]
public async Task<IHttpActionResult> SomeEndpoint()
{
    // parse the string content from the request
    var content = await Request.Content.ReadAsStringAsync();
    var xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(content);
    var root = xmlDoc.DocumentElement;

    // next, get your values using the XML path relative to the root node in the request
    var example = GetXmlNodeValue(root, "Path/To/Value");
    // then do something with your values and return
    return Ok();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51715727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档