我认为这很容易,但事实并非如此 - 至少对我而言。我正在尝试将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而没有运气。我错过了什么必须有一些显而易见的东西,我没有。
答案 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
?