1

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

    [HttpPost]
    public void Post([FromBody]XElement value)
    {   
        ...
    }

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

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

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信息?

我在调试输出中看到以下异常:

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 中是否有更详细的日志来检查问题所在?

4

2 回答 2

0

我能够通过使用 XMLDocument 类 (System.XML) 执行类似于 @Nkosi 所做的事情来完成此操作。

对我有用的是:

[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();
}
于 2021-07-02T18:10:19.527 回答
0

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

[HttpPost]
public IHtpActionResult Post([FromBody]string value) {
    if(string.IsNullOrWhiteSpace(value))
        return BadRequest();

    Xelement element = XElement.Parse(value);

    //...
}

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

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

于 2018-08-07T01:46:37.923 回答