使用C#

时间:2018-05-18 14:49:48

标签: c# xml http restsharp

我认为这很容易,但事实并非如此 - 至少对我而言。我正在尝试将XML字符串发送到REST端点。此时,端点唯一要做的就是将XML记录到文件或数据库中。 XML本身是未知的,它可以是字面上的任何长度并且具有任意数量的节点。所以它确实需要被视为一个字符串。

我的问题是我无法确定如何在Post方法中接收XML /字符串。我正在使用RestSharp库。

这是我正在使用的Post方法;非常简单。我删除了日志代码并尝试/捕获代码以保持简单。

[HttpPost]
public IHttpActionResult Post([FromBody] string status)
{
    // Log the post into the DB
    LogPost(status);
}

执行帖子的代码:

public void TestPost()
{
    IRestResponse response;
    try
    {
        // Get the base url for 
        var url = @"http://blahblah/status";
        // Create the XML content
        object xmlContent = "<XML><test><name>Mark</name></test></XML>";
        var client = new RestClient(url);
        var request = new RestRequest(Method.POST);
        // Add required headers
        request.AddHeader("Content-Type", "text/plain");
        request.AddHeader("cache-control", "no-cache");
        request.AddJsonBody(xmlContent);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        response = client.Execute(request);
    }
    catch (Exception ex)
    {
       ...
    }
}

问题:帖子收到的状态参数只是&#34;标记&#34;。缺少完整的XML!我需要整个XML字符串。

我尝试了一些不同的变体。将内容类型更改为&#34; application / xml&#34;,&#34; application / json&#34;等。没有任何工作。

我尝试过使用request.AddXmlBody(statusObject)和request.AddBody(statusObject)。两者都没有成功。

我甚至尝试使用request.AddHeader()发送XML而没有运气。我错过了什么必须有一些显而易见的东西,我没有。

2 个答案:

答案 0 :(得分:3)

a)您必须配置Web API以在WebApiConfig.Register中使用XmlSerializer。否则,Web API默认使用DataContractSerializer。

文件:App_Start \ WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Formatters.XmlFormatter.UseXmlSerializer = true; //HERE!
        ...
    }

b)您需要为xml定义一个类

    public class test { public string name { get; set; } } //BASED ON YOUR XML NODE

    [HttpPost]
    public IHttpActionResult Post([FromBody] string status)
    {

    }

c)如果您需要使用简单的字符串,请更改POST方法

    public void Post(HttpRequestMessage request)
    {
        string body = request.Content.ReadAsStringAsync().Result;

    }

d)从restsharp客户端调用

            string xmlContent = "<test><name>Mark</name></test>"; 
            var client = new RestClient(url);
            var request = new RestRequest(Method.POST);
            request.AddParameter("application/xml", xmlContent, ParameterType.RequestBody); 
            var response = client.Execute(request);

对于“某些”原因request.AddParameter将第一个参数作为ContentType(而不是Name) https://github.com/restsharp/RestSharp/issues/901

答案 1 :(得分:0)

您是否尝试使用

发送请求

Content-Type: application/xml; charset="utf-8"

而不是text\plain