Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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# 如果内容是XML格式的,如何在.NET Core 2.2中发布文章?_C#_Asp.net Core_.net Core_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# 如果内容是XML格式的,如何在.NET Core 2.2中发布文章?

C# 如果内容是XML格式的,如何在.NET Core 2.2中发布文章?,c#,asp.net-core,.net-core,httpwebrequest,httpwebresponse,C#,Asp.net Core,.net Core,Httpwebrequest,Httpwebresponse,我对这个问题感到非常惊讶,因为我记得在早期的.NET核心版本中成功地解决了这个问题。我正在开发一个.NETCore2.2应用程序,现在需要另一个只能发布xml的应用程序(外部开发)来调用它 这是我的ConfigureServices方法: public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Ve

我对这个问题感到非常惊讶,因为我记得在早期的.NET核心版本中成功地解决了这个问题。我正在开发一个.NETCore2.2应用程序,现在需要另一个只能发布xml的应用程序(外部开发)来调用它

这是我的ConfigureServices方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddXmlSerializerFormatters();
}
这是我的控制器:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // POST api/values
    [HttpPost]
    public ActionResult<object> Post([FromBody] object value)
    {
        return ("Hi", "Hi2");
    }
}
这给了我xml作为响应和

POST http://localhost:58774/api/values
Content-Type: application/json
Accept: application/json
User-Agent: vscode-restclient
Accept-Encoding: gzip

{"a":5}
它给出json作为响应

但是,此调用会导致状态代码为500的响应(这正是我的问题):

POSThttp://localhost:58774/api/values
内容类型:application/xml
接受:应用程序/xml
用户代理:vscode restclient
接受编码:gzip
但它在.NETCore2.2中似乎不起作用。我做错了什么?如何在.NETCore2.2中发布xml

有用评论后的更新。 导致500的异常是:

System.InvalidOperationException:XML文档中存在错误 (1, 11). ---> System.InvalidOperationException:不是 预料之中

但是,如果我添加一个xmlns(基于),我仍然有500:

POST http://localhost:5000/api/values
Content-Type: application/xml
Accept: application/xml
User-Agent: vscode-restclient
Accept-Encoding: gzip

<f:table xmlns:f="https://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>
POSThttp://localhost:5000/api/values
内容类型:application/xml
接受:应用程序/xml
用户代理:vscode restclient
接受编码:gzip
非洲咖啡桌
80
120
那么异常消息是:

System.InvalidOperationException:XML文档中存在错误 (1, 56). ---> System.InvalidOperationException:https://www.w3schools.com/furniture“>这是意料之中的


可能,我需要更改我的xml。怎么用?即使是w3cschools的例子也帮不了我。

对于
内容类型:application/json
{“a”:5}
,您将在服务器端收到
{“a”:5}
。它收到的是纯文本


对于带有
内容类型:application/xml
,如果您希望接收
,可以实现自定义
XDocumentInputFormatter

public class XDocumentInputFormatter : InputFormatter, IInputFormatter, IApiRequestFormatMetadataProvider
{
    public XDocumentInputFormatter()
    {
        SupportedMediaTypes.Add("application/xml");
    }

    protected override bool CanReadType(Type type)
    {
        if (type.IsAssignableFrom(typeof(XDocument))) return true;
        return base.CanReadType(type);
    }

    public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        var xmlDoc = await XDocument.LoadAsync(context.HttpContext.Request.Body, LoadOptions.None, CancellationToken.None);

        return InputFormatterResult.Success(xmlDoc);
    }
}
默认情况下,对于
XmlSerializer
,我们需要提供
Type-Type
,对象类型将无法反序列化

如果
对象值的类型定义如下

public class A
{
    public int a { get; set; }
}
你可以像这样改变你的方法

public ActionResult<object> Post([FromBody] A value)
{
    return new A { a = 1 };//("Hi", "Hi2");
}
public ActionResult Post([FromBody]A值)
{
返回新的A{A=1};/(“Hi”,“Hi2”);
}
并且有这样的要求

<A>
    <a>1</a>
</A>

1.

它将用A类对象填充值。

500后面应该有一个特定的异常。这是什么?有:System.InvalidOperationException:XML文档(1,11)中有一个错误。-->System.InvalidOperationException:不是预期的。有点冒险,但是您是否尝试过添加xml声明作为xml的第一行?i、 我做了一个新的webapi项目,它在xml声明中出现了错误。我认为这可能是xml序列化程序的一个错误,因为我直接从同一个端点复制了xml输出,并将其用作输入…您对
对象值的期望值是多少?
?回答很好-这在我的测试中是有效的,但它实际上是必要的,这似乎很奇怪。。。默认的xmlserializer应该可以正常工作。
public class A
{
    public int a { get; set; }
}
public ActionResult<object> Post([FromBody] A value)
{
    return new A { a = 1 };//("Hi", "Hi2");
}
<A>
    <a>1</a>
</A>